Pregunta Unity se registra para una sola interfaz Multiple Object y le dice a la unidad dónde inyectarlos


Hola. He estado teniendo problemas para decirle a Unity que para una interfaz si tiene varias implementaciones, quiero que las inyecte en diferentes clases. Esto es lo que quiero decir:

Digamos que tengo una interfaz IProductCatalogService y dos implementaciones ProductCatalog : IProductCatalogService y ProductCatalogService : IProductCatalogService.

¿Cómo voy a decirle a Unity que para la clase A que quiero en mi constructor pasó una instancia de tipo ProductCatalog y para la clase B Quiero una instancia de ProductCatalogService.

Estoy usando Unity en un proyecto API web ASP.NET y he configurado el resolver en GLobalConfiguration.

Para registros sencillos de 1 a 1, todo funciona.

Esto es lo que he intentado, pero parece que no funciona:

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

En el DependencyServiceModel, From es la interfaz, To es el objeto de bruja quiero instanciar y ForClasses son el tipo para el que quiero usar el To Objeto.


9
2017-09-06 19:35


origen


Respuestas:


En el siguiente ejemplo, tiene una interfaz implementada dos veces e inyectada a pedido en dos clases de clientes diferentes, tal como lo solicita. El truco es usar registros con nombre.

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)
    {

    }
}

Probablemente esto es lo que haces mal:

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

Usted crea un registro con nombre para su clase concreta. En cambio, deberías tener

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

22
2017-09-06 20:20