我有一个可选的依赖资源库类:
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。
有没有办法做到这一点?
在.RegisterType<IMyRepository, MyRepository>()
调用,指定InjectionConstructor与OptionalParameter ,如在
.RegisterType<IMyRepository, MyRepository>(new InjectionConstructor(
new ResolvedParameter<IDataContext>(),
new OptionalParameter<ICacheProvider>()));
我发现RegisterType,而不是注册情况下,支持返回null。
container.RegisterType<IInterface>(new InjectionFactory((c) => null));
这是获得一个实际的最直接的方法null
归还。
对于“可有可无”的依赖,你应该使用属性注入,而不是构造函数注入。 配置将是这个样子:
public class MyRepository
{
public ICacheProvider Cache { get; set; }
}
container.RegisterType<MyRepository>(new InjectionProperty("Cache", typeof(ICacheProvider)));
这将注入的实现ICacheProvider
到指定属性Cache
您的MyRepository
。 正如你所必须实现零检查,无论你做出了一个电话Cache
存储库类的内部属性我会去与@ dtryon的建议和实施NullCacheProvider
。 这是更为方便,不容易出错。
我已经实现了某种对我的可选依赖一个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>();
所有这一切的一点是,在特定的储存库可以作用不同,这取决于存在的可选依赖的事实。 它可能看起来像一些建筑的缺陷,但该解决方案符合我的要求。