MVC依赖关系解析器有条件

时间:2014-08-30 12:13:39

标签: asp.net-mvc unity-container

我正在使用依赖解析器,我已将我的统一容器添加到同一个。因此默认情况下,“GoldCustomer”会根据当前容器规则注入“CustomerController”。

IUnityContainer oContainer = new UnityContainer();
oContainer.RegisterType<ICustomer, GoldCustomer>(); // injects GoldCustomer
DependencyResolver.SetResolver(new UnityDependencyResolver(oContainer));

如果我想通过当前的容器配置进行更改,我总是可以创建新的Container并设置它并再次调用SetResolver。我知道上面的代码应该可以通过XML配置进行配置,但是如果我们需要拾取新的容器对象,我们仍然需要调用setresolver。

这是正确的方法还是有更好的方法在应用程序运行时更改容器依赖规则。

第二,我们可以更改容器的事件是session_start,httphandler或更好的东西。

2 个答案:

答案 0 :(得分:0)

首先为什么需要多个容器?它必须是单例对象,它保留了自应用程序启动以来注册的所有依赖项。

在实践中,我会说保留单个容器,如果需要,在单独的程序集中创建多个注册函数,并在AppBootstrapper中调用所有这些函数。

如果它是一个应用程序,那么最好的方法是使用Application start with Async行为,这样启动就不会受到影响。

=============================================== =======

不幸的是,命名注册是唯一的选项,Unity需要明确注册名称。这就是为什么我个人喜欢像Autofac和SimpleInjector这样的DI容器。它们很快,它们允许多个类型的接口多次注册,解析器使用类型解析器和命名解析器方法,而不明确要求名称,这些解析器也可以覆盖。

答案 1 :(得分:0)

我不确定为什么它看起来不那么复杂,如果我很快理解问题,我可以按照以下方式进行,

假设我有IMovieRepository接口和两个实现它的类EnglishMovieRepository和HindiMovieRepository。

如何在UnityConfig.cs中解析它们,如下所示,

    If(condition)
    {
         container.RegisterType<IMovieRepository, EnglishMovieRepository>();
    }
   else
   {
      container.RegisterType<IMovieRepository, HindiMovieRepository>();
   }

如果要求有所不同,请告诉我

由于 / DJ