Autofac基于TypedParameter的不同服务分辨率

时间:2010-08-06 11:08:43

标签: c# dependency-injection inversion-of-control autofac

无论如何都要使用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并能够通过将其传递给autofac来解析IEditor的类型。我想这样做,以便我可以通过简单地继承IEditor并使用IEditor所用的适当构造函数类型来“覆盖”类型的编辑器。

谢谢。

1 个答案:

答案 0 :(得分:0)

看看我对this question的解决方案。也许您可以使用相同的解决方案,而使用Func<Type, IService>工厂代理,并将ServiceImplX Keyed 添加到相应的子类型,而不是使用命名注册。