C# 使用Autofac按属性解析不同的实例

C# 使用Autofac按属性解析不同的实例,c#,.net-core,autofac,C#,.net Core,Autofac,我想知道是否可以使用Autofac注册同一类的不同实例,然后使用consumer类的构造函数中的属性解析正确的实例 我知道我们可以注册一个接口的两个不同实现,并使用一个属性来解析好的实现。例如: ContainerBuilder cb = new ContainerBuilder(); cb.RegisterType<EnglishHello>().Keyed<IHello>("EN"); cb.RegisterType<FrenchHello>().

我想知道是否可以使用Autofac注册同一类的不同实例,然后使用consumer类的构造函数中的属性解析正确的实例

我知道我们可以注册一个接口的两个不同实现,并使用一个属性来解析好的实现。例如:

 ContainerBuilder cb = new ContainerBuilder();

 cb.RegisterType<EnglishHello>().Keyed<IHello>("EN");
 cb.RegisterType<FrenchHello>().Keyed<IHello>("FR");
 cb.RegisterType<HelloConsumer>().WithAttributeFilter();
 var container = cb.Build();
这第一个样品一切正常

我尝试了以下方法:

var helloEn=new Hello();
var helloFr=new Hello();    
//init properties...
helloFr.Greetings="Salut";
helloEn.Greetings="Hi";

cb.Register<Hello>(x=>helloEn).Keyed<IHello>("EN");
cb.Register<Hello>(x=>helloFr).Keyed<IHello>("FR");
var helloEn=newhello();
var helloFr=newhello();
//初始化属性。。。
helloFr.问候语=“敬礼”;
你好。问候语=“你好”;
寄存器(x=>helloEn).Keyed(“EN”);
寄存器(x=>helloFr.Keyed(“FR”);
它编译得很好,但在解析HelloConsumer类期间,构造函数的参数“helloService”为null

是否有可能通过Autofac实现这种行为,或者我错过了什么


(与核心
.WithAttributeFiltering()
扩展相关,但不是同一个问题)

。这似乎很管用

using System;
using Autofac;
using Autofac.Features.AttributeFilters;

public class Program
{
    public interface IHello
    {
         string Greetings { get; }
    }

    public class Hello : IHello
    {
        public string Greetings
        {
            get;
            set;
        }
    }

    public class HelloConsumer
    {
        public HelloConsumer([KeyFilter("EN")] IHello hello)
        {
            Console.WriteLine(hello.Greetings);
        }
    }

    public static void Main()
    {
        ContainerBuilder cb = new ContainerBuilder();
        cb.RegisterType<HelloConsumer>().AsSelf().WithAttributeFiltering();
        var helloEn = new Hello { Greetings = "Hi" };
        var helloFr = new Hello { Greetings = "Bonjour" };
        cb.Register<Hello>(x => helloEn).Keyed<IHello>("EN");
        cb.Register<Hello>(x => helloFr).Keyed<IHello>("FR");
        var container = cb.Build();

        container.Resolve<HelloConsumer>(); // Should write the correct greeting
    }
}
使用系统;
使用Autofac;
使用Autofac.Features.AttributeFilter;
公共课程
{
公共接口IHello
{
字符串问候语{get;}
}
公共课你好:IHello
{
公共字符串问候语
{
得到;
设置
}
}
公共类HelloConsumer
{
公共HelloConsumer([KeyFilter(“EN”)]IHello hello)
{
Console.WriteLine(您好,您好);
}
}
公共静态void Main()
{
ContainerBuilder cb=新的ContainerBuilder();
cb.RegisterType().AsSelf().WithAttributeFiltering();
var helloEn=newhello{Greetings=“Hi”};
var helloFr=newhello{hellives=“Bonjour”};
寄存器(x=>helloEn).Keyed(“EN”);
寄存器(x=>helloFr.Keyed(“FR”);
var container=cb.Build();
container.Resolve();//应编写正确的问候语
}
}

小提琴:

谢谢。你说得对,这很有效。我意识到我在我的例子中过分简化了这个问题。我认为真正的问题是对“Register”的调用是异步完成的,并且发生在对“container.Build”的调用之后。我会尽快检查,更新我的帖子,如果是这样的话,我会接受你的回答。
using System;
using Autofac;
using Autofac.Features.AttributeFilters;

public class Program
{
    public interface IHello
    {
         string Greetings { get; }
    }

    public class Hello : IHello
    {
        public string Greetings
        {
            get;
            set;
        }
    }

    public class HelloConsumer
    {
        public HelloConsumer([KeyFilter("EN")] IHello hello)
        {
            Console.WriteLine(hello.Greetings);
        }
    }

    public static void Main()
    {
        ContainerBuilder cb = new ContainerBuilder();
        cb.RegisterType<HelloConsumer>().AsSelf().WithAttributeFiltering();
        var helloEn = new Hello { Greetings = "Hi" };
        var helloFr = new Hello { Greetings = "Bonjour" };
        cb.Register<Hello>(x => helloEn).Keyed<IHello>("EN");
        cb.Register<Hello>(x => helloFr).Keyed<IHello>("FR");
        var container = cb.Build();

        container.Resolve<HelloConsumer>(); // Should write the correct greeting
    }
}