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>()通话中,指定InjectionConstructor与OptionalParameter,如
.RegisterType<IMyRepository, MyRepository>(new InjectionConstructor(
new ResolvedParameter<IDataContext>(),
new OptionalParameter<ICacheProvider>()));
Run Code Online (Sandbox Code Playgroud)
对于'很好的'依赖,你应该使用属性注入而不是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.这样更方便,更不容易出错.