UnityContainer: условная логика при разрешении - PullRequest
2 голосов
/ 18 ноября 2010

У меня есть интерфейс с 3 различными реализациями. Я регистрирую 3 реализации как именованные псевдонимы в Web.config веб-приложения, используя Unity Container.

Есть ли способ использовать Unity, чтобы разрешить один из зарегистрированных экземпляров, основываясь на некоторой логике. логика включает в себя обращение к БД, чтобы решить, какую реализацию следует разрешить.

Ценю вашу помощь.

С уважением Билал

Ответы [ 2 ]

2 голосов
/ 18 ноября 2010

Вы можете реализовать логику в абстрактной фабрике и внедрить ее:

public interface IMyInterface { }

public interface IMyInterfaceFactory {
   IMyInterface GetMyInterface();
}

public class MyInterfaceFactory : IMyInterfaceFactory  {
       private readonly IUnityContainer _container;
       public MyInterfaceFactory(IUnityContainer container) { 
           _container = container; }

       IMyInterface GetMyInterface() {
            var impName = Get_implementation_name_from_db();
            return container.Resolve<IMyInterface>(impName);
        }
}
1 голос
/ 18 ноября 2010

Вы можете создать реализацию «маршрутизатора», которая знает, как направить запросы в одну из других реализаций:

// Here is a possible implementation of the router. There are 
// of course many ways to do this.
public class MyRouterImpl : IMyInterface
{
    List<IMyInterface> implementations = new List<IMyInterface>();

    public MyRouterImpl(MyImpl1 i1, MyImpl2 i2, MyImpl3 i3)
    {
        this.implementations.Add(i1);
        this.implementations.Add(i2);
        this.implementations.Add(i3);
    }

    void IMyInterface.Method()
    {
        int indexOfImplementationToExecute = 
            GetIndexOfImplementationToExecute();

        IMyInterface impl =
            this.implementations[indexOfImplementationToExecute];

        impl.Method();
    }
}
...