Регистр 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)));