Frage

Gibt es trotzdem Autofac zu bekommen, den Dienst zu lösen, die eine konkrete Umsetzung mit dem Konstruktor hat, die einen bestimmten Parameter übereinstimmt am speziellsten.

Damit meine ich, für ein Kind Typ einen Konstruktor übereinstimmen, anstatt den Konstruktor für die Basistyp entsprechen.

Zum Beispiel würde Ich mag den folgenden Testdurchlauf machen

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

Mein Ziel ist es IService, IEditor und in der Lage zu machen, den IEditor für eine Art zu lösen, indem es zu Autofac vorbei. Ich möchte, dies zu tun, so dass ich „überschreiben“ der Editor für einen Typen von einfach IEditor vererben und der entsprechenden Konstruktortyp mit, dass IEditor ist für.

Danke.

War es hilfreich?

Lösung

Werfen Sie einen Blick auf meine Lösung diese Frage . Vielleicht können Sie die gleiche Lösung, mit einer Func<Type, IService> Fabrik Delegierten stattdessen verwenden, und haben ServiceImplX Codiert in dem entsprechenden Kind-Typ anstelle von Named Registrierungen verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top