Разрешение именованных регистраций из Unity 2.0 с использованием MVC3 IDependencyResolver - PullRequest
3 голосов
/ 25 августа 2011

всем!

У меня проблема с разрешением именованных регистраций в Unity 2.0 с использованием MVC3 IDependencyResolver.

Я настроил регистрации типов как

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");
    }
}

Код для IDependencyResolveris

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 голос
/ 26 августа 2011

Насколько я понимаю, вы пытаетесь использовать инъекцию IService в какой-то контроллер:

public class HomeController : Controller
{
  private IService _service;

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

Затем вы можете сделать это следующим образом (вы должны явно назначить named-instance для каждого контроллера):

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

И вы не должны передавать регистрационное имя в mvc resolver, потому что это бессмысленно (у нас есть только один (по умолчанию именованный) тип контроллеров):

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 - по умолчанию и с именами?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...