3

everyone!使用MVC3解析来自Unity 2.0的命名注册IDependencyResolver

我在使用MVC3 IDependencyResolver从Unity 2.0解析命名注册时遇到问题。

我配置的类型登记为

public class Implementations 
{ 
    private IUnityContainer unityContainer; 

    internal Implementations() 
    { 
     this.unityContainer = new UnityContainer(); 
    } 

    public static IUnityContainer GetUnityContainer() 
    { 
     Implementations implementations = new Implementations(); 

     implementations.RegisterImplementations(); 

     return implementations.unityContainer; 
    } 

    private void RegisterImplementations() 
    { 
     this.unityContainer 
      .RegisterType<IService, TestService>() 
      .RegisterType<IService, TestService2>("ts2"); 
    } 
} 

代码的IDependencyResolver是

public class UnityDependencyResolver : IDependencyResolver 
{ 
    IUnityContainer container = null; 
    string namedRegistration = null; 

    public UnityDependencyResolver(IUnityContainer container, string name) 
    { 
     this.container = container; 
     this.namedRegistration = name; 
    } 

    public object GetService(Type serviceType) 
    { 
     try 
     { 
      return this.container.Resolve(serviceType, this.namedRegistration); 
     } 
     catch 
     { 
      return null; 
     } 
    } 

    public IEnumerable<object> GetServices(Type serviceType) 
    { 
     try 
     { 
      return this.container.ResolveAll(serviceType); 
     } 
     catch 
     { 
      return new List<object>(); 
     } 
    } 
} 

和方法调用中的Application_Start是

protected void Application_Start() 
{ 
    var dependency = 
     new UnityDependencyResolver(Implementations.GetUnityContainer(), "ts2"); 
    DependencyResolver.SetResolver(dependency); 

    AreaRegistration.RegisterAllAreas(); 

    RegisterGlobalFilters(GlobalFilters.Filters); 
    RegisterRoutes(RouteTable.Routes); 
} 

我想这样做,无论是在UnityDependencyResolver或任何其他方式,是解决我的命名实例或默认实例如果命名不存在。当前代码总是解析为默认实例(不命名)。

有没有人有想法如何做到这一点?

谢谢。

+1

您是否找到解决方案?我需要完全相同! –

回答

1

据我了解您尝试使用IService注入一些控制器:

public class HomeController : Controller 
{ 
    private IService _service; 

    public HomeController(IService service) 
    { 
    _service = service; 
    } 
// .. 
} 

然后,你可以做这样的(你应该明确地指定命名实例的每个控制器):

private void RegisterImplementations() 
{ 
    _unityContainer 
    .RegisterType<IService, Service1>() 
    .RegisterType<IService, Service2>("ts2") 
    .RegisterType<HomeController>(new InjectionConstructor(new ResolvedParameter<IService>("ts2"))); 
} 

,你不应该传递的注册名称MVC解析器COS这是没有意义的(我们只有一个(命名)型控制器默认):

public class UnityDependencyResolver : IDependencyResolver 
{ 
    private readonly IUnityContainer container; 

    public UnityDependencyResolver(IUnityContainer container) 
    { 
    this.container = container; 
    } 

    #region IDependencyResolver Members 

    public object GetService(Type serviceType) 
    { 
    try 
    { 
     return container.Resolve(serviceType); 
    } 
    catch 
    { 
     return null; 
    } 
    } 
// .. 
} 

PS为什么你需要一些IService的实例 - 默认和命名?