首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用MVC3 IDependencyResolver解析Unity2.0中的命名注册

使用MVC3 IDependencyResolver解析Unity2.0中的命名注册
EN

Stack Overflow用户
提问于 2011-08-26 03:53:48
回答 1查看 1.2K关注 0票数 3

所有人!

我在使用MVC3 IDependencyResolver解析Unity2.0中的命名注册时遇到了问题。

我将类型注册配置为

代码语言:javascript
复制
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的代码是

代码语言:javascript
复制
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中的方法调用是

代码语言:javascript
复制
protected void Application_Start()
{
    var dependency =
        new UnityDependencyResolver(Implementations.GetUnityContainer(), "ts2");
    DependencyResolver.SetResolver(dependency);

    AreaRegistration.RegisterAllAreas();

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

我想要做的是,无论是在UnityDependencyResolver中还是以任何其他方式,如果命名实例不存在,则解析我的命名实例或默认实例。当前代码始终解析为默认实例(没有命名实例)。

有没有人知道怎么做?

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2011-08-26 16:16:24

据我所知,您尝试将IService注入到一些控制器中:

代码语言:javascript
复制
public class HomeController : Controller
{
  private IService _service;

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

然后您可以这样做(您应该显式地为每个控制器分配命名实例):

代码语言:javascript
复制
private void RegisterImplementations()
{
  _unityContainer
    .RegisterType<IService, Service1>()
    .RegisterType<IService, Service2>("ts2")
    .RegisterType<HomeController>(new InjectionConstructor(new ResolvedParameter<IService>("ts2")));
}

您不应该将注册名称传递给mvc解析器,因为它是没有意义的(我们只有一种(默认命名的)控制器类型):

代码语言:javascript
复制
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 - default和named的实例?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7196385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档