Autofac。命名解析和子依赖

时间:2017-12-31 06:46:30

标签: c# .net autofac

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 { }
        }
    }
}

1 个答案:

答案 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");

这将允许您使用其名称解析主类,同时确保它们也接收正确的命名依赖项。