我正在使用依赖解析程序,并已将我的统一容器添加到该容器中。因此,默认情况下,"GoldCustomer"会根据当前容器规则注入到"CustomerController"中。
IUnityContainer oContainer = new UnityContainer();
oContainer.RegisterType<ICustomer, GoldCustomer>(); // injects GoldCustomer
DependencyResolver.SetResolver(new UnityDependencyResolver(oContainer));
如果我想按当前容器配置进行更改,我总是可以创建新的container并设置它,然后再次调用SetResolver。我知道上面的代码应该可以通过XML配置进行配置,但如果我们需要获取新的容器对象,我们仍然必须调用setresolver。
这是正确的方法吗?或者有更好的方法在应用程序运行时更改容器依赖性规则吗。
其次,我们可以更改容器的事件是session_start、httphandler或其他更好的事件。
首先,为什么需要多个容器?它必须是自应用程序启动以来注册所有依赖项的singleton对象。
在实践中,我会说保留单个容器,如果需要,在单独的程序集中创建多个Registration函数,并在AppBootstrapper中调用所有这些函数。
若它是一个应用程序,那个么最好的方法是使用异步行为启动应用程序,这样启动就不会受到影响。
==============================================
不幸的是,命名注册是唯一的选择,Unity需要明确注册名称。这就是为什么我个人喜欢像Autofac和SimpleInjector这样的DI容器。它们很快,允许多个类型的接口进行多次注册,解析程序使用类型解析程序和命名解析程序方法,而无需明确要求名称,这些解析程序也可重写。
我不知道为什么它在我看来没有那么复杂,如果我能很快理解这个问题,我可以按如下方式完成,
假设我有接口IMovieRepository和两个实现它的类EnglishMovieRepository和HindiMovieRepository。
如何解决他们在UnityConfig.cs如下,
If(condition)
{
container.RegisterType<IMovieRepository, EnglishMovieRepository>();
}
else
{
container.RegisterType<IMovieRepository, HindiMovieRepository>();
}
如果要求有所不同,请让我知道
谢谢/dj