zoukankan      html  css  js  c++  java
  • autofac初识

    在开始autofac时,有必要先了解两个关键词:“控制反转(IoC/Inverse Of Control)”与“依赖注入(DI/Dependence injection)”。

    控制反转(IoC):它把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理。

    依赖注入(DI):就是由IoC容器在运行期间,动态地将某种依赖关系注入到对象之中。

    public class BMW 
        {
            /// <summary>
            /// 
            /// </summary>
            /// <param name="series">车系</param>
            public void Create(string series)
            {
                Console.WriteLine("生产了宝马" + series);
            }
        }
    
        public class Porsche
        {
            /// <summary>
            /// 
            /// </summary>
            /// <param name="series">车系</param>
            public void Create(string series)
            {
                Console.WriteLine("生产了宝时捷" + series);
            }
        }

    上面定义了宝马与保时捷两个类,它们都有Create方法,参数车系,传统的调用方式如下:

    BMW bmw = new BMW();
    bmw.Create("730Li");
    Porsche porsche = new Porsche();
    porsche.Create("卡宴");

    这里我们看到,需要使用new创建实例并调用方法

    改进,使用工厂方式

    public interface ICarCreator
        {
            void Create(string series);
        }
    
        public class BMW : ICarCreator
        {
            /// <summary>
            /// 
            /// </summary>
            /// <param name="series">车系</param>
            public void Create(string series)
            {
                Console.WriteLine("生产了宝马" + series);
            }
        }
    
        public class Porsche : ICarCreator
        {
            /// <summary>
            /// 
            /// </summary>
            /// <param name="series">车系</param>
            public void Create(string series)
            {
                Console.WriteLine("生产了宝时捷" + series);
            }
        }

    调用方式,这里使用了反射的形式,在配置文件里配置(类似支持多个数据库的操作工厂)

                ICarCreator car = (ICarCreator)Assembly.GetExecutingAssembly().CreateInstance(ConfigurationManager.AppSettings["Brand"]);   //使用了反射方式
                car.Create("suv");
    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <appSettings>
        <add key="Brand" value="AutofacDemo1.BMW"/>
      </appSettings>
        <startup> 
            <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
        </startup>
    </configuration>

    进一步改进,使用autofac,将创建实例交给autofac

    var builder = new ContainerBuilder();
    
    builder.RegisterType<ICarCreator>();
    builder.RegisterType<BMW>().As<ICarCreator>();
    //builder.RegisterType<Porsche>().As<ICarCreator>();
    Container = builder.Build();
    using (var scope = Container.BeginLifetimeScope())
    {
        var writer = scope.Resolve<ICarCreator>();
        writer.Create("轿车");
    }

    完整的代码如下:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Reflection;
    using System.Text;
    using System.Threading.Tasks;
    using System.Configuration;
    using Autofac;
    
    namespace AutofacDemo1
    {
        class Program
        {
            private static IContainer Container { get; set; }
            static void Main(string[] args)
            {
                #region 普通的调用
                //BMW bmw = new BMW();
                //bmw.Create("730Li");
                //Porsche porsche = new Porsche();
                //porsche.Create("卡宴");
                #endregion
    
                #region 工厂的方式 
                //ICarCreator car = (ICarCreator)Assembly.GetExecutingAssembly().CreateInstance(ConfigurationManager.AppSettings["Brand"]);   //使用了反射方式
                //car.Create("suv");
                #endregion
    
                #region 使用Ioc[Autofac]
                var builder = new ContainerBuilder();
    
                builder.RegisterType<ICarCreator>();
                builder.RegisterType<BMW>().As<ICarCreator>();
                //builder.RegisterType<Porsche>().As<ICarCreator>();
                Container = builder.Build();
                using (var scope = Container.BeginLifetimeScope())
                {
                    var writer = scope.Resolve<ICarCreator>();
                    writer.Create("轿车");
                }
                #endregion
    
                Console.ReadKey();
            }
        }
    
        public interface ICarCreator
        {
            void Create(string series);
        }
    
        public class BMW : ICarCreator
        {
            /// <summary>
            /// 
            /// </summary>
            /// <param name="series">车系</param>
            public void Create(string series)
            {
                Console.WriteLine("生产了宝马" + series);
            }
        }
    
        public class Porsche : ICarCreator
        {
            /// <summary>
            /// 
            /// </summary>
            /// <param name="series">车系</param>
            public void Create(string series)
            {
                Console.WriteLine("生产了宝时捷" + series);
            }
        }
    }
    View Code
  • 相关阅读:
    shopping car 1.0
    文件分类
    求1-100的所有数的和
    输出 1-100 内的所有奇数和
    求1-2+3-4+5 ... 99的所有数的和
    关闭提示的下拉框
    h5页面乱码-设置编码
    常用的css
    渲染后新元素没有绑定事件
    爬虫日记-关于一些动态爬取
  • 原文地址:https://www.cnblogs.com/godbell/p/7170718.html
Copyright © 2011-2022 走看看