注册null作为实例在Unity容器(Register null as instance in Un

2019-06-26 03:28发布

我有一个可选的依赖资源库类:

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

    // …
}

的cacheProvider参数的存在,作为战略储备库。 我想这样的设置统一的容器:

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

即不指出具体的InjectionConstructor与MyRepository一个参数,而是使用默认的构造函数,使用null作为参数的cacheProvider。

有没有办法做到这一点?

Answer 1:

.RegisterType<IMyRepository, MyRepository>()调用,指定InjectionConstructor与OptionalParameter ,如在

.RegisterType<IMyRepository, MyRepository>(new InjectionConstructor(
new ResolvedParameter<IDataContext>(), 
new OptionalParameter<ICacheProvider>()));


Answer 2:

我发现RegisterType,而不是注册情况下,支持返回null。

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

这是获得一个实际的最直接的方法null归还。



Answer 3:

对于“可有可无”的依赖,你应该使用属性注入,而不是构造函数注入。 配置将是这个样子:

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

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

这将注入的实现ICacheProvider到指定属性Cache您的MyRepository 。 正如你所必须实现零检查,无论你做出了一个电话Cache存储库类的内部属性我会去与@ dtryon的建议和实施NullCacheProvider 。 这是更为方便,不容易出错。



Answer 4:

我已经实现了某种对我的可选依赖一个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);
    }
}

然后,在一个项目中我不需要缓存我有这样配置的统一:

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

所有这一切的一点是,在特定的储存库可以作用不同,这取决于存在的可选依赖的事实。 它可能看起来像一些建筑的缺陷,但该解决方案符合我的要求。



文章来源: Register null as instance in Unity container