C# 使用Autofac按属性解析不同的实例
我想知道是否可以使用Autofac注册同一类的不同实例,然后使用consumer类的构造函数中的属性解析正确的实例 我知道我们可以注册一个接口的两个不同实现,并使用一个属性来解析好的实现。例如: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>().
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
}
}