Pregunta

¿Hay alguna forma de conseguir autofac para resolver el servicio que tiene una aplicación concreta con el constructor que coincide con un parámetro dado más específicamente.

Con esto quiero decir que coincida con un constructor para un tipo de niño en lugar de hacer coincidir el constructor para el tipo de base.

Por ejemplo me gustaría hacer la siguiente pase de prueba

[TestFixture]
public class AutofacResolvTestFixture
{
    [Test]
    public void test()
    {
        var cb = new ContainerBuilder();
        cb.RegisterType<Child1>();
        cb.RegisterType<Child2>();
        cb.RegisterType<ServiceImpl1>().As<IService>();
        cb.RegisterType<ServiceImpl2>().As<IService>();
        var container = cb.Build();
        var c1=container.Resolve<Child1>();
        var c2=container.Resolve<Child2>();
        var s1 = container.Resolve<IService>(new TypedParameter(c1.GetType(), c1));
        var s2 = container.Resolve<IService>(new TypedParameter(c2.GetType(), c2));
        Assert.That(s1, Is.InstanceOf<ServiceImpl1>());
        Assert.That(s2, Is.InstanceOf<ServiceImpl2>());
        Assert.That(s1.ConstructorParam, Is.SameAs(c1));
        Assert.That(s2.ConstructorParam, Is.SameAs(c2));
    }
}

public class baseClass {}
public class Child1 : baseClass{}
public class Child2 : baseClass{}

public interface IService
{
    baseClass ConstructorParam { get; }
}

public class ServiceImpl1 : IService
{
    private baseClass _b;
    public ServiceImpl1(baseClass b)
    {
        _b = b;
    }

    public baseClass ConstructorParam
    {
        get
        {
            return _b;
        }
    }
}


public class ServiceImpl2 : IService
{
    private baseClass _b;
    public ServiceImpl2(Child2 b)
    {
        _b = b;
    }

    public baseClass ConstructorParam
    {
        get
        {
            return _b;
        }
    }
}

Mi objetivo es hacer IService, IEditor y ser capaz de resolver el IEditor para un tipo pasándolo a autofac. Quiero hacer esto para que pueda "anular" el editor para un tipo simplemente heredar IEditor y utilizando el constructor de tipo apropiado que es para que IEditor.

Gracias.

¿Fue útil?

Solución

Tome un vistazo a mi solución a esta pregunta . Tal vez se puede utilizar la misma solución, con un delegado de la fábrica Func<Type, IService> lugar, y tienen ServiceImplX Con clave para el tipo correspondiente en lugar de utilizar los registros con nombre del niño.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top