6

次のシナリオを最適に処理する方法を見つけようとしています。

RequestContext次のような外部サービスに依存するクラスを想定します。

public class RequestContext : IRequestContext
{
    private readonly ServiceFactory<IWeatherService> _weatherService;

    public RequestContext(ServiceFactory<IWeatherService> weatherService, UserLocation location, string query)
    {
       _weatherService = weatherService;
       ...

最終的にインスタンス化するクラスでは、どのような種類の依存関係が必要RequestContextですか?可能性はありますがServiceFactory<IWeatherService>、それは正しくないようです。または、次のように作成することもできますIRequestContextFactory

public class RequestContextFactory : IRequestContextFactory
{
    private readonly ServiceFactory<IWeatherService> _weatherService;

    public RequestContextFactory(ServiceFactory<IWeatherService> weatherService)
    {
        _weatherService = weatherService;
    }

    public RequestContext Create(UserLocation location, string query)
    {
        return new RequestContext(_weatherService, location, query);
    }
}

次に、IRequestContextFactoryスルーコンストラクターインジェクションを渡します。

これは良い方法のように思えますが、このアプローチの問題は、発見可能性を妨げると思うことです(開発者はファクトリについて知って実装する必要がありますが、実際には明らかではありません)。

私が見逃しているより良い/より発見可能な方法はありますか?

4

2 に答える 2

5

疎結合の利点は、以前の詳細を常に隠すことができることです。

IRequestContext の消費者の観点からは、RequestContext の存在とその依存関係は純粋に実装の詳細です。Liskov Substitution Principleにより、コンシューマーは IRequestContext のみを処理する必要があります。

public class MyClass
{
    private readonly IRequestContext reqCtx;

    public MyClass(IRequestContext reqCtx)
    {
        if (reqCtx == null)
        {
            throw new ArgumentNullException("reqCtx");
        }

        this.reqCtx = reqCtx;
    }

    // Implement using this.reqCtx...
}

最終的にすべてを結び付ける必要があるのは、アプリケーションのコンポジション ルートだけです。貧乏人の DI アプローチのスケッチを次に示します。

ServiceFactory<IWeatherService> weatherService =
    new ServiceFactory<IWeatherService>();
UserLocation location = new UserLocation;
string query = "foo";

IRequestContext reqCtx = new RequestContext(weatherService, location, query);

var mc = new MyClass(reqCtx);
于 2010-06-10T12:28:03.847 に答える
0

ファクトリパターンは、よく知られており、文書化され、使用されている方法です。他の開発者が最新ではないことを懸念している場合は、コードの(xml)ドキュメントにウィキペディアのファクトリパターンページへのリンクを配置してください。

また、ファクトリに一貫した名前を付けるようにしてください。Microsoftはプロバイダーサフィックスを気に入っているようです。

于 2010-06-10T13:10:07.540 に答える