在Unity容器中将null注册为实例

v0i*_*0id 17 .net c# unity-container

我有一个带有可选依赖项的存储库类:

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

    // …
}
Run Code Online (Sandbox Code Playgroud)

cacheProvider参数的存在充当存储库的策略.我想要像这样设置Unity容器:

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

即没有为MyRepository指出具有一个参数的特定InjectionConstructor,而是使用带有null的默认构造函数作为cacheProvider参数.

有没有办法做到这一点?

mrw*_*aim 24

我发现RegisterType而不是Register实例支持返回null.

container.RegisterType<IInterface>(new InjectionFactory((c) => null));
Run Code Online (Sandbox Code Playgroud)

这是获得实际null返回的最简单方法.


cyn*_*nic 11

.RegisterType<IMyRepository, MyRepository>()通话中,指定InjectionConstructorOptionalParameter,如

.RegisterType<IMyRepository, MyRepository>(new InjectionConstructor(
new ResolvedParameter<IDataContext>(), 
new OptionalParameter<ICacheProvider>()));
Run Code Online (Sandbox Code Playgroud)


Seb*_*ber 5

对于'很好的'依赖,你应该使用属性注入而不是ctor注入.Config看起来像这样:

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

container.RegisterType<MyRepository>(new InjectionProperty("Cache", typeof(ICacheProvider)));
Run Code Online (Sandbox Code Playgroud)

这会将一个实现注入ICacheProvider到一个名为Cache你的属性中MyRepository.因为你必须实现空检查,无论你Cache在仓库类中调用属性,我都会使用@ dtryon的提议并实现一个NullCacheProvider.这样更方便,更不容易出错.