19

オプションの依存関係を持つリポジトリクラスがあります:

class MyRepository : BaseRepository, IMyRepository
{
    public MyRepository(IDataContext dataContext, ICacheProvider cacheProvider = null)
        : base(dataContext, cacheProvider)
    {}

    // …
}

cacheProviderパラメーターの存在は、リポジトリーの戦略として機能します。Unityコンテナを次のようにセットアップしたい:

Container.RegisterType<IDataContext, MyDataContext>(new PerResolveLifetimeManager(), new InjectionConstructor())
         .RegisterInstance<ICacheProvider>(null) // ???
         .RegisterType<IMyRepository, MyRepository>();

つまり、MyRepositoryの1つのパラメーターを持つ特定のInjectionConstructorを指摘するのではなく、cacheProviderパラメーターとしてnullを持つデフォルトのコンストラクターを使用します。

これを行う方法はありますか?

4

5 に答える 5

27

Registerインスタンスの代わりにRegisterTypeがnullの返しをサポートしていることがわかりました。

container.RegisterType<IInterface>(new InjectionFactory((c) => null));

nullこれは、実際の返品を取得するための最も簡単な方法でした。

于 2013-05-07T01:44:59.457 に答える
11

.RegisterType<IMyRepository, MyRepository>()呼び出しでは、次のように、 OptionalParameterを使用してInjectionConstructorを指定します。

.RegisterType<IMyRepository, MyRepository>(new InjectionConstructor(
new ResolvedParameter<IDataContext>(), 
new OptionalParameter<ICacheProvider>()));
于 2012-07-10T10:48:44.317 に答える
6

「必要な」依存関係については、ctorインジェクションの代わりにプロパティインジェクションを使用する必要があります。構成は次のようになります。

public class MyRepository
{
  public ICacheProvider Cache { get; set; }
}

container.RegisterType<MyRepository>(new InjectionProperty("Cache", typeof(ICacheProvider)));

ICacheProviderそれはあなたのという名前のプロパティにの実装を注入しCacheますMyRepository。リポジトリクラス内のプロパティを呼び出す場合は常にnullチェックを実装する必要があるため、Cache@ dtryonの提案に従って、を実装しNullCacheProviderます。これははるかに便利で、エラーが発生しにくくなります。

于 2012-07-09T10:21:15.347 に答える
4

最も単純な廃止されていないソリューション

InjectionFactoryを使用したRegisterTypeの呼び出しは現在廃止されているため、現在推奨されているアプローチは次のとおりです。

container.RegisterFactory<ITypeToResolve>(c => null);

柔軟な拡張方法

または、必要なものを返す拡張メソッドを作成する場合は、次のようにすることができます。

public static void RegisterFactory<TToResolve>(IUnityContainer container, Func<TToResolve> factory) => 
        container.RegisterFactory<TToResolve>(c => factory.Invoke());

次に、それを消費するには、次のようにします。

container.RegisterFactory<ITypeToResolve>(() => new MyTypeToResolve());
于 2019-09-20T00:01:24.780 に答える
0

オプションの依存関係にある種のNullObjectパターンを実装することで終了しました。

public class NullCacheProvider : ICacheProvider
{
    // …
}

そして、基本リポジトリクラスで私はチェックしています:

public class BaseRepository
{
    protected readonly ICacheProvider CacheProvider;
    protected readonly bool ShouldUseCache;

    protected BaseRepository(IDataContext context, ICacheProvider cacheProvider)
    {
        CacheProvider = cacheProvider;
        ShouldUseCache = 
            CacheProvider != null && !(CacheProvider is NullCacheProvider);
    }
}

次に、キャッシュを必要としないプロジェクトでは、Unityを次のように構成しました。

container
    .RegisterType<IDataContext, MyDataContext>(new PerResolveLifetimeManager(), new InjectionConstructor())
    .RegisterType<ICacheProvider, NullCacheProvider>() 
    .RegisterType<IMyRepository, MyRepository>();

このすべてのポイントは、特定のリポジトリが、オプションの依存関係の存在の事実に応じて異なる動作をする可能性があるということです。アーキテクチャ上の欠陥のように見えるかもしれませんが、ソリューションは私の要件を満たしています。

于 2012-07-10T10:38:55.323 に答える