2

私は現在、サービスの場所に依存しないファクトリ クラスを作成しようとしています。

私が考えることができる他の唯一の代替手段は、コンストラクター注入を使用してすべての可能なインスタンスを注入することですが、クラスが参照を介して渡されるため、驚きにつながる可能性があります。また、可能なプロバイダーの数が増えると、費用がかかり、面倒になる可能性があります.

プロバイダー自体は、独自の依存関係を持つ完全に複雑なクラスであるため、手動で構築する必要はありません。

更新されたサービスの場所の例:

    public class ProviderFactory : IProviderFactory
    {
        private readonly IProviderConfigurationService _providerConfigurationService;

        public enum SearchType
        {
            Foo,
            Bar
        }

        public ProviderFactory(IProviderConfigurationService providerConfigurationService)
        {
            _providerConfigurationService = providerConfigurationService;
        }

        public Collection<IProvider> GetProviderInstances(SearchType searchType)
        {
            // Provider configuration service will read a XML/DB store to retrieve list of search providers applicable for a search type
            var providerList = _providerConfigurationService.GetProviderList(searchType);
            return new Collection<IProvider>(providerList.ForEach(x=> ServiceLocator.GetInstance(typeof(x))).ToList()) ;
        }
    }

他のオプションは何ですか? 現在、DIにUnityを使用しています。

4

3 に答える 3

2

別の方法は、コンストラクターに a を渡し、Func<Type, object>コンテナーを介して関数を実装することです。

unity.RegisterInstance<Func<Type, object>>(t => unity.Resolve(t))

次に、クラスで:

public ProviderFactory(Func<Type, object> createFunc, IProviderConfigurationService pcs)
{
    _createFunc = createFunc; 
}

public Collection<IProvider> GetProviderInstances(SearchType searchType)
{
    var providerList = _providerConfigurationService.GetProviderList(searchType);
    return new Collection<IProvider>(providerList.Select(_createFunc).ToList());
}
于 2013-10-01T05:21:44.090 に答える
1

抽象化がありません。

抽象化ProviderFactoryを実装する必要がありIProviderFactoryます。このようにして、そのインターフェイスをアプリケーションのベース ライブラリに配置し、ProviderFactory実装をComposition Root内に配置できます。コンポジション ルート内に存在するコードの場合、DI ライブラリを参照してもかまいません。その場合、サービスの場所を使用していません

于 2013-09-26T09:22:30.217 に答える