Autofac具有相同类型的两个属性

时间:2012-06-27 07:50:27

标签: c# autofac

如果我在一个具有相同接口类型的类中有两个属性,并且我想为每个类型注入两种不同的conrete类型,我如何使用属性或构造函数注入autofac来执行此操作。

例如

class A : IA
{
    public IB PropertyB { get; set; }
    public IB PropertyC { get; set; }

    public A(IB b, IB c)
    {
        PropertyB = b;
        PropertyC = c;
    }

    public void PrintB()
    {
        PropertyB.Print();
    }

    public void PrintC()
    {
        PropertyC.Print();
    }
}

我已经尝试过了,但当然我只是在两个属性中都注入了C

    var builder = new ContainerBuilder();

    builder.RegisterType<B>().As<IB>();
    builder.RegisterType<C>().As<IB>();
    builder.RegisterType<A>().As<IA>();

    var container = builder.Build();
    var a = container.Resolve<IA>();

或者结果相同:

    builder.RegisterType<B>().As<IB>();
    builder.RegisterType<C>().As<IB>();
    builder.RegisterType<A>().As<IA>().PropertiesAutowired();

    var container = builder.Build();
    var a = container.Resolve<IA>();

有没有办法告诉autofac我想要PropertyB中的B和PropertyC中的C?

1 个答案:

答案 0 :(得分:2)

使用属性注入,您可以执行以下操作:

builder.RegisterType<A>()
    .As<IA>()
    .OnActivating(e =>
{
    e.Instance.PropertyB = e.Context.Resolve<BImpl1>();
    e.Instance.PropertyC = e.Context.Resolve<BImpl2>();
});