Autofac 自动装配

自动装配:从容器中的可用服务中选择一个构造函数来创建对象实例

1 使用组件的默认构造函数创建对象实例

组件代码如下:

    public class ConstructorClass
    {
        public string Msg = string.Empty;

        public ConstructorClass()
        {
            this.Msg = "默认构造方法";
        }

        public ConstructorClass(Class1 class1)
        {
            this.Msg = "Class1";
        }

        public ConstructorClass(Class1 class1,Class2 class2)
        {
            this.Msg = "Class1  Class2";
        }

        public ConstructorClass(string para1,string para2)
        {
            this.Msg = "para1 para2";
        }
    }

    public class Class1
    {
    }

    public class Class2
    {
    }

使用服务的代码如下:

        static void Main(string[] args)
        {
            var builder = new ContainerBuilder();

            builder.RegisterType<ConstructorClass>();
            Container=builder.Build();

            ResolveTest();

            Console.ReadLine();
        }

        public static void ResolveTest()
        {
            using(var scope = Container.BeginLifetimeScope())
            {
                var defaultConstructorClass = scope.Resolve<ConstructorClass>();

                Console.WriteLine(defaultConstructorClass.Msg);
            }
        }

运行结果:

 

 分析:由于容器中的可用服务只有 ConstructorClass ,所以autofac默认是以 ConstructorClass 的默认构造函数来构造组件的实例。

2 在解析时指定使用某个构造函数

组件代码:

    public class ConstructorClass
    {
        public string Msg = string.Empty;

        public ConstructorClass()
        {
            this.Msg = "默认构造方法";
        }

        public ConstructorClass(Class1 class1)
        {
            this.Msg = "Class1";
        }

        public ConstructorClass(Class1 class1,Class2 class2)
        {
            this.Msg = "Class1  Class2";
        }

        public ConstructorClass(string para1,string para2)
        {
            this.Msg = "para1 para2__"+ para1+ para2;
        }

        public ConstructorClass(Class1 class1, string para1,string para2)
        {
            this.Msg = "Class1 para1 para2__"+ para1+ para2;
        }
    }

    public class Class1
    {
    }

    public class Class2
    {
    }

使用服务的代码如下:

        static void Main(string[] args)
        {
            var builder = new ContainerBuilder();

            builder.RegisterType<ConstructorClass>();
            Container=builder.Build();

            ResolveTest();

            Console.ReadLine();
        }

        public static void ResolveTest()
        {
            using(var scope = Container.BeginLifetimeScope())
            {
                // 使用默认的构造函数
                var defaultConstructorClass = scope.Resolve<ConstructorClass>();

                // 使用指定的构造函数 public ConstructorClass(string para1,string para2){}
                var p1p2Cons = scope.Resolve<ConstructorClass>(new NamedParameter("para1", "p1"), new NamedParameter("para2", "p2"));  // 注意参数名一定要与构造方法里的参数名一致

                // 使用指定的构造函数  public ConstructorClass(Class1 class1, string para1,string para2)
                var c1p1p2Cons=scope.Resolve<ConstructorClass>(new TypedParameter(typeof(Class1), new Class1()), new NamedParameter("para1", "p1"), new NamedParameter("para2", "p2"));

                Console.WriteLine(defaultConstructorClass.Msg);
                Console.WriteLine(p1p2Cons.Msg);
                Console.WriteLine(c1p1p2Cons.Msg);
            }
        }

运行结果:

 

 3 尽可能最多参数匹配

组件代码:

    public class ConstructorClass
    {
        public string Msg = string.Empty;

        public ConstructorClass()
        {
            this.Msg = "默认构造方法";
        }

        public ConstructorClass(Class1 class1)
        {
            this.Msg = "Class1";
        }

        public ConstructorClass(Class1 class1,Class2 class2)
        {
            this.Msg = "Class1  Class2";
        }

        public ConstructorClass(string para1,string para2)
        {
            this.Msg = "para1 para2__"+ para1+ para2;
        }

        public ConstructorClass(Class1 class1, string para1,string para2)
        {
            this.Msg = "Class1 para1 para2__"+ para1+ para2;
        }
    }

    public class Class1
    {
    }

    public class Class2
    {
    }

使用服务的代码如下:

        static void Main(string[] args)
        {
            var builder = new ContainerBuilder();

            builder.RegisterType<Class1>();
            builder.RegisterType<Class2>();
            //builder.RegisterType<ConstructorClass>().UsingConstructor(typeof(Class1),typeof(Class2)); // 需要注册 Class1和Class2
            builder.RegisterType<ConstructorClass>();
            Container =builder.Build();

            ResolveTest();

            Console.ReadLine();
        }

        public static void ResolveTest()
        {
            using(var scope = Container.BeginLifetimeScope())
            {
                var cons = scope.Resolve<ConstructorClass>();

                Console.WriteLine(cons.Msg);
            }
        }

运行结果:

 

 由于 Class1和Class2都已注册,所以ConstructorClass构造实例时会优先匹配有 Class1和Class2和构造方法。

 

参考

https://www.cnblogs.com/GnailGnepGnaw/p/10757340.html

posted @ 2020-11-25 20:23  温故纳新  阅读(217)  评论(0编辑  收藏  举报