1
IModificationRequst<Employee> req = new ModificationRequst();
Locator.Instance.GetService<IModificationRequstHandler<Employee>>().Handle(req);

IModificationRequstHandlerを実装するオブジェクトのインスタンスを返すサービスを見つけるサービスロケーターがあります。

IModificationRequstHandler実装者を返すのではなく、に変更しようとしています。これは、サービスを内部的に検出してそのハンドラーメソッドを呼び出すだけなので、上記の2行は代わりに次のようになります。

IModificationRequst<Employee> req = new ModificationRequst();
Locator.Instance.HandleRequest<IModificationRequst<Employee>>(req);

しかし、ジェネリックスに苦労しているので、ハンドラーを取得してクライアントからHandleメソッドを呼び出すのではなく、適切なリクエストハンドラーにリクエストを再変換して処理を呼び出すためのパターンがすでに確立されていますか?

4

2 に答える 2

1

これは単一責任の原則に違反します。サービスロケーターにさまざまなサービスのロジックを実装させないでください。

静的クラスを使用する場合は、別のクラスを追加する必要があります。

public static class RequestHandler
{
    public static void Handle<T>(T request)
    {
        Locator.Instance.GetService<IModificationRequstHandler<T>>().Handle(req);
    }
}

その後:

IModificationRequst<Employee> req = new ModificationRequst();
RequestHandler.Handle(req);

補足:コードをより保守しやすくするため、依存性注入とIoCコンテナーを検索する場合があります)

于 2013-01-03T06:30:18.323 に答える
1

ロケーターHandleRequestクラスのメソッドは、次のように定義する必要があります(Handlereturnタイプがvoid)であると想定しています。

public void HandleRequest<T>(IModificationRequest<T> req)
{
    IModificationRequstHandler<T> handler = GetService<IModificationRequest<T>>();
    handler.Handle(req);
}

IModificationRequstHandlerインターフェイスは次のように定義する必要があります。

public interface IModificationRequstHandler<T>
{
    void Handle(IModificationRequst<T> req);
}

そして、あなたの電話は次のようになります:

Locator.Instance.HandleRequest(req);

ここでのジェネリック型パラメーターEmployeeはパラメーター値から推測されるreqため、指定する必要はありません。

于 2013-01-03T04:47:37.547 に答える