named / keyed解析是否也使用名称解析子依赖关系?或者命名解析仅对已解析的类型应用名称/密钥而不包含其子依赖项?
发生错误:
没有任何构造函数与' Autofac.Core.Activators.Reflection.DefaultConstructorFinder'在类型' ConsoleApplication1.Program + MainClassOne'可以使用可用的服务和参数调用: 无法解析参数' INamed named'构造函数' Void .ctor(INamed)'。
class Program
{
static void Main(string[] args)
{
var container = new ContainerBuilder();
container.RegisterType<NamedB>().Named<INamed>("B");
container.RegisterType<NamedA>().Named<INamed>("A");
container.RegisterType<MainClassOne>().Named<MainClassOne>("A");
container.RegisterType<MainClassTwo>().Named<MainClassTwo>("B");
var di = container.Build();
var a = di.ResolveNamed<MainClassTwo>("B");
var a2 = di.ResolveNamed<MainClassOne>("A");
}
public class MainClassOne
{
public MainClassOne(INamed named)
{
Console.WriteLine("MainClassOne= " + named.Name);
}
}
public class MainClassTwo
{
public MainClassTwo(INamed named)
{
Console.WriteLine("MainClassTwo= " + named.Name);
}
}
public interface INamed
{
string Name { get; set; }
}
public class NamedA : INamed
{
public string Name
{
get { return "A"; }
set { }
}
}
public class NamedB : INamed
{
public string Name
{
get { return "B"; }
set { }
}
}
}
答案 0 :(得分:0)
密钥仅在解析请求的服务时使用。如果密钥被传递给后续的解析操作,则它将要求依赖关系图中的所有服务也使用相同的密钥注册。
您尝试实现的目标可以使用基于lambda的注册来完成,这些注册使主类的依赖性显式化。
container.RegisterType<NamedA>().Named<INamed>("A");
container.RegisterType<NamedB>().Named<INamed>("B");
container.Register(c => new MainClassOne(c.ResolveNamed<INamed>("A"))).Named<MainClassOne>("A");
container.Register(c => new MainClassTwo(c.ResolveNamed<INamed>("B"))).Named<MainClassTwo>("B");
这将允许您使用其名称解析主类,同时确保它们也接收正确的命名依赖项。