Регистр Unity для одного интерфейса нескольких объектов и скажите Unity, куда их вводить

Привет у меня возникли проблемы с попыткой сказать Unity, что для интерфейса , если он имеет несколько реализаций, я хочу, чтобы он вводил их в разные классы.Вот что я имею в виду:

допустим, у меня есть интерфейс IProductCatalogService и две реализации ProductCatalog : IProductCatalogService и ProductCatalogService : IProductCatalogService.

как бы я сказал Unity, что для класса A я хочу, чтобы в моем конструкторе прошел экземпляр типа ProductCatalog и для класс B Я хочу экземпляр ProductCatalogService.

Я использую Unity в ASP.NET проект Web API, и я установил распознаватель в GLobalConfiguration.

для простых регистраций от 1 до 1 все работает.

вот что я пробовал, но, похоже, не работает:

public class DependencyServiceModel
{
    public Type From { get; set; }
    public Type To { get; set; }
    public IEnumerable<Type> ForClasses { get; set; }
}

public void RegisterTypeForSpecificClasses(DependencyServiceModel dependencyService)
{
    foreach (var forClass in dependencyService.ForClasses)
    {
        string uniquename = Guid.NewGuid().ToString();

        Container.RegisterType(dependencyService.From, 
            dependencyService.To, uniquename);

        Container.RegisterType(forClass, uniquename, 
            new InjectionConstructor(
                new ResolvedParameter(dependencyService.To)));
    }
}

на DependencyServiceModel, From - это интерфейс, To является объектом ведьмы, которую я хочу создать и ForClasses - это тип, для которого я хочу использовать

1 ответов


В приведенном ниже примере у вас есть интерфейс, реализованный дважды и введенный по требованию в два разных клиентских класса, так же, как вы запрашиваете. Фокус в том, чтобы использовать именованные регистрации.

class Program
{
    static void Main(string[] args)
    {
        IUnityContainer container = new UnityContainer();
        container.RegisterType<IFoo, Foo1>("Foo1");
        container.RegisterType<IFoo, Foo2>("Foo2");

        container.RegisterType<Client1>(new InjectionConstructor(new ResolvedParameter<IFoo>("Foo1")));
        container.RegisterType<Client2>(new InjectionConstructor(new ResolvedParameter<IFoo>("Foo2")));

        Client1 client1 = container.Resolve<Client1>();
        Client2 client2 = container.Resolve<Client2>();
    }
}

public interface IFoo
{

}

public class Foo1 :IFoo
{

}

public class Foo2 : IFoo
{

}

public class Client1
{
    public Client1(IFoo foo)
    {

    }
}

public class Client2
{
    public Client2(IFoo foo)
    {

    }
}

это, скорее всего, то, что вы делаете неправильно:

 Container.RegisterType(forClass, uniquename, 
        new InjectionConstructor(
            new ResolvedParameter(dependencyService.To)));

вы создаете именованную регистрацию для своего конкретного класса. Вместо этого вы должны есть!--4-->

 Container.RegisterType(forClass, null, 
        new InjectionConstructor(
            new ResolvedParameter(dependencyService.To, uniquename)));