あるレイヤーから別のレイヤーに情報を渡す

mosquito87

抽象ビュー:あるレイヤーから別のレイヤーに情報を渡したい(注:このスレッドに適したタイトルがある場合はお知らせください)。

ビューおよびサービスレイヤーと通信するViewModelがあります。そして、永続層とのサービス層通信があります。

次のクラスがあるとしましょう。

public class EmployeeViewModel()
{
    // The following properties are binded to my View (bidirectional communication)
    public Firstname ...
    public Lastname ...
    public Email ...

    public void PerformingSearch()
    {
        ...
        EmployeeService.Search(...);
        ...
    }
}

public class EmployeeService()
{
    public List<Employee> Search(...)
    {
        // Searching in db
    }
}

ViewModelからサービスレイヤーにデータを渡すためのベストプラクティスは何ですか(検索の実行など)?

いくつかのオプションが表示されます(ViewModelパースペクティブ):

  1. EmployeeService.Search(Firstname、Lastname、Email);
  2. EmployeeService.Search(employeeSearchModel); //この場合、別のモデルが必要になります。モデルはどのようにインスタンス化する必要がありますか?
  3. EmployeeService.Search(this); //変換はどこかで行う必要があります

この問題のデザインパターンはありますか?それはどのように呼ばれますか?どのオプションが最適ですか?私は何かを逃しましたか?

ケイス

問題のあるスペースを説明する

あなたの特定の例は、あなたの現在のアーキテクチャには、データアクセス層へのプロキシとして機能するサービス層が含まれていることを示しています。アーキテクチャに関するより深い知識がなければ、環境が許す限りシンプル保つための可能な解決策を提案します。

それでは、可能なソリューションモデルを取得するための戦略を選択してみましょうユーザーストーリーは、「ユーザーが情報を送信して従業員のリストを取得する」のように聞こえます。

簡略化された現在のユースケース:

  1. UI:提供する必要のある情報を送信します。
  2. VM:検索語を受け取り、サービスレイヤーの隣に渡します。
  3. SL:受信したデータをデータアクセス層に送信します(そしておそらくVMプロパティへの応答値を更新します)。
  4. DAL:永続ストアで情報を検索し、取得した値を返します。

リファクタリングされたユースケースの例:

  1. VM:必要な値をカプセル化してクエリを呼び出し、UIに表示するプロパティを設定します。

簡単に見えますか?

入力:コマンドクエリ分離

要するにCQS:

すべてのメソッドは、アクションを実行するコマンドか、呼び出し元にデータを返すクエリのいずれかである必要がありますが、両方ではないことを示します。

あなたの特定のケースでは、クエリに焦点を当てる必要があります

クエリ:結果を返し、システムの監視可能な状態を変更しないでください(副作用はありません)。

しかし、これはどのように役立ちますか?どれどれ。CQSクエリ側の非常に優れた詳細な説明はStevenの「一方...私のアーキテクチャのクエリ側」ブログ投稿で完全に読むことができます

問題に適用されるクエリの概念

クエリオブジェクトのインターフェイスを定義する

public interface IQuery<TResult> {}

クエリハンドラの定義:

public interface IQueryHandler<TQuery, TResult> where TQuery : IQuery<TResult>
{
    TResult Handle(TQuery query);
}

これが「検索」クエリオブジェクトの実装ですこれは事実上、「情報を渡す方法」の質問に対する答えです。

public class FindEmployeeBySearchTextQuery : IQuery<Employee>
{
    public string FirstName { get; set; }

    public string LastName { get; set; }

    public string Email { get; set; }
}

そして最後に、クエリオブジェクトに渡すクエリハンドラを作成します。

public class FindEmployeeBySearchTextQueryHandler
    : IQueryHandler<FindEmployeeBySearchTextQuery, List<Employee>>
{
    private readonly IDbContext db;

    public FindEmployeeBySearchTextQueryHandler(IDbContext db)
    {
        this.db = db;
    }

    public List<Employee> Handle(FindEmployeeBySearchTextQuery query)
    {
        return (
            from employee in this.db.employees
            where employee.FirstName.Contains(query.FirstName) ||
                  employee.LastName.Contains(query.LastName) ||
                  employee.Email == query.Email
            select employee )
            .ToList();
    }
}

注:このHandle()実装例ではEntity Frameworksを使用しIDbContextているため、必要に応じてこれを修正/変更する必要があります(ADO.NET、NHibernateなど)。

そして最後にあなたのビューモデルで:

public class EmployeeViewModel()
{
    private readonly IQueryHandler _queryHandler;
    public EmployeeViewModel(IQueryHandler queryHandler) 
    {
        _queryHandler = queryHandler;
    }

    public void PerformingSearch()
    {
        var query = new FindEmployeeBySearchTextQuery
        {
            FirstName = "John", 
            LastName = "Doe",
            Email = "[email protected]"
        };

        List<Employee> employees = _queryHandler.Handle(query);

        // .. Do further processing of the obtained data
    }
}

この例では、依存性注入を使用していることを前提としています。
IQueryHandler実装をビューモデルコンストラクターに挿入し、後で受け取った実装で作業します。

このアプローチを使用すると、コードがよりクリーンになり、ユースケース主導型になり、責任の分離が向上します。これにより、横断的関心事を簡単にテストして装飾できます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

cocos2d:あるレイヤーから別のレイヤーにCCSpriteを描画する

分類Dev

オフセットなしでイラストレーターのあるレイヤーから別のレイヤーにpageItemを複製する

分類Dev

Google Maps JavascriptAPIで重複するレイヤーから情報を取得する

分類Dev

PythonスクリプトからDymola情報レイヤーを再現する

分類Dev

ViewModelレイヤーからViewレイヤーにデータを渡す方法

分類Dev

Pythonを使用して1つのレイヤーから別のレイヤーにフィルターをコピーする方法はありますか

分類Dev

現在のユーザーをApiレイヤーからサービスレイヤーに渡す方法

分類Dev

wmsレイヤーに情報テンプレートを設定する方法

分類Dev

畳み込み出力に別のレイヤーを外部から追加する

分類Dev

あるモデルからレイヤーを取得し、それを別のモデルに割り当てます

分類Dev

QGISコピーアンドペーストポイントをあるレイヤーから別のレイヤーに

分類Dev

iOSでAGSFeatureレイヤーに関する詳細情報を取得する方法

分類Dev

iOSでAGSFeatureレイヤーに関する詳細情報を取得する方法

分類Dev

HTMLに従って統計ページからプレーヤーの情報を抽出する方法は?

分類Dev

plotlyの特定のレイヤー(geom)のホバー情報を無効にする

分類Dev

共有レイヤーの出力をレイヤーに渡します

分類Dev

Google Map Javascript:geojson都市レイヤーの境界にのみ情報ウィンドウを表示する方法

分類Dev

あるボイドから別のボイドに情報を渡す方法は?

分類Dev

psdファイルでレイヤーの関係やグループ情報を取得するにはどうすればよいですか?

分類Dev

Rasterbrickの下位レイヤーからデータを抽出する

分類Dev

ホバー時に別のレイヤーが移動すると、そのレイヤーがホバーしてからホバー停止します

分類Dev

GoogleマップAPIのデータレイヤーに情報ウィンドウを追加するにはどうすればよいですか

分類Dev

情報ウィンドウに重なる複数のkmlレイヤー

分類Dev

Keras APIを使用して「入力レイヤーから非表示レイヤーへ」および「非表示レイヤーから出力レイヤーへ」の重みを抽出するにはどうすればよいですか?

分類Dev

プレイヤーの周りにあらゆる方向からランダムに敵を生成します

分類Dev

OpenLayersのさまざまなレイヤーに情報を追加するにはどうすればよいですか?

分類Dev

ワイヤレスネットワークの詳細情報を確認するにはどうすればよいですか?

分類Dev

Vulkanインスタンスレイヤーと拡張機能に関する情報はどこにありますか?

分類Dev

Unity TileMaps:特定のVector3の場所を占めるタイルのレイヤー名、タグ、またはその他の識別情報を返すにはどうすればよいですか?

Related 関連記事

  1. 1

    cocos2d:あるレイヤーから別のレイヤーにCCSpriteを描画する

  2. 2

    オフセットなしでイラストレーターのあるレイヤーから別のレイヤーにpageItemを複製する

  3. 3

    Google Maps JavascriptAPIで重複するレイヤーから情報を取得する

  4. 4

    PythonスクリプトからDymola情報レイヤーを再現する

  5. 5

    ViewModelレイヤーからViewレイヤーにデータを渡す方法

  6. 6

    Pythonを使用して1つのレイヤーから別のレイヤーにフィルターをコピーする方法はありますか

  7. 7

    現在のユーザーをApiレイヤーからサービスレイヤーに渡す方法

  8. 8

    wmsレイヤーに情報テンプレートを設定する方法

  9. 9

    畳み込み出力に別のレイヤーを外部から追加する

  10. 10

    あるモデルからレイヤーを取得し、それを別のモデルに割り当てます

  11. 11

    QGISコピーアンドペーストポイントをあるレイヤーから別のレイヤーに

  12. 12

    iOSでAGSFeatureレイヤーに関する詳細情報を取得する方法

  13. 13

    iOSでAGSFeatureレイヤーに関する詳細情報を取得する方法

  14. 14

    HTMLに従って統計ページからプレーヤーの情報を抽出する方法は?

  15. 15

    plotlyの特定のレイヤー(geom)のホバー情報を無効にする

  16. 16

    共有レイヤーの出力をレイヤーに渡します

  17. 17

    Google Map Javascript:geojson都市レイヤーの境界にのみ情報ウィンドウを表示する方法

  18. 18

    あるボイドから別のボイドに情報を渡す方法は?

  19. 19

    psdファイルでレイヤーの関係やグループ情報を取得するにはどうすればよいですか?

  20. 20

    Rasterbrickの下位レイヤーからデータを抽出する

  21. 21

    ホバー時に別のレイヤーが移動すると、そのレイヤーがホバーしてからホバー停止します

  22. 22

    GoogleマップAPIのデータレイヤーに情報ウィンドウを追加するにはどうすればよいですか

  23. 23

    情報ウィンドウに重なる複数のkmlレイヤー

  24. 24

    Keras APIを使用して「入力レイヤーから非表示レイヤーへ」および「非表示レイヤーから出力レイヤーへ」の重みを抽出するにはどうすればよいですか?

  25. 25

    プレイヤーの周りにあらゆる方向からランダムに敵を生成します

  26. 26

    OpenLayersのさまざまなレイヤーに情報を追加するにはどうすればよいですか?

  27. 27

    ワイヤレスネットワークの詳細情報を確認するにはどうすればよいですか?

  28. 28

    Vulkanインスタンスレイヤーと拡張機能に関する情報はどこにありますか?

  29. 29

    Unity TileMaps:特定のVector3の場所を占めるタイルのレイヤー名、タグ、またはその他の識別情報を返すにはどうすればよいですか?

ホットタグ

アーカイブ