Autofac различное разрешение службы на основе TypedParameter - PullRequest
2 голосов
/ 06 августа 2010

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

Под этим я подразумеваю сопоставление конструктора для дочернего типа вместо сопоставления сКонструктор для базового типа.

Например, я хотел бы выполнить следующий тестовый тест

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

Моя цель - сделать IService, IEditor и иметь возможность разрешать IEditor длявведите, передав его в autofac.Я хочу сделать это так, чтобы я мог «переопределить» редактор для типа, просто унаследовав IEditor и используя соответствующий тип конструктора, для которого предназначен этот IEditor.

Спасибо.

1 Ответ

0 голосов
/ 06 августа 2010

Взгляните на мое решение на этот вопрос . Возможно, вы можете использовать то же решение с Func<Type, IService> фабричным делегатом и использовать ServiceImplX Keyed для соответствующего дочернего типа вместо использования именованных регистраций.

...