• Autofac(01)


    目录:

    • 控制反转
    • 依赖注入
    • Autofac的使用

    1.控制反转

    1.1耦合

      多重依赖关系,在对象和各模块都会出现。一个类知道交互类的大量信息就是高耦合,修改这个类就容易破坏交互类

    1.2降低耦合

    • 在两块代码之间引入抽象层
    public interface IMessageService
    {
    void SendMessage();
    }
    
    public class EmailService : IMessageService
    {
    public  void SendMessage()
    {
    Console.WriteLine("通过电子邮件发送消息");
    }
    }
    
    public class MessageManager
    {
    private IMessageService msgService;
    public MessageManager()
    {
    msgService=new EmailService();
    }
    
    public void SendMsg()
    {
    msgService.SendMessage();
    }
    }
    引入抽象层
    • 把选择抽象实现的责任移除到消费者的外部

    需要把EmailService类的创建移到MessageManager类的外面。

    1.3控制反转

      把依赖移除到依赖类的外部,称为控制反转。是抽象的,只表示移除

    2.依赖注入

      依赖注入是一种控制反转的形式,注入方式通常采用两种:

    • 构造函数注入

    只需存储一个接口,不需依赖项

    public class MessageManager
    {
    private IMessageService msgService;
    
    public MessageManager(IMessaageService service)
    {
    msgService=service;
    }
    
    public void SendMsg()
    {
    msgService.SendMessage();
    }
    }
    • 属性注入

    设置对象上的公共属性

    public class MessageManager
    {
    public IMessageService msgService {get; set;}
    
    public void SendMsg()
    {
    if (msgService ==null)
    {
    Throw new InvalidOperationException();
    }
    msgService.SendMessage();
    }
    }

    3.依赖注入框架

    Autofac是一款IOC容器框架,轻量级,性能高。

    3.1Autofac的使用

    • 安装Autofac
        // 数据源操作接口
        public interface IDataSource
        {
            // 获取数据
            string GetData();
        }
    
        // SQLSERVER数据库
        public class Sqlserver : IDataSource
        {
            public string GetData()
            {
                return "通过SQLSERVER获取数据";
            }
        }
    
        // ORACLE数据库
      public class Oracle : IDataSource
        {
            public string GetData()
            {
                return "通过Oracle获取数据";
            }
        }
    
       /// 数据源管理类
          public class DataSourceManager
      {
    
              IDataSource _ds;
            // 根据传入的类型动态创建对象
            public DataSourceManager(IDataSource ds)
            {
                _ds = ds;
            }
    
          public string GetData()
            {
                return _ds.GetData();
            }
        }
    
        static void Main(string[] args)
        {
             //获取Autofac容器构造器
            var builder = new ContainerBuilder();
    
            // 注册类型
        builder.RegisterType<DataSourceManager>();
    
            // 注册实例(即将SqlServer类型注册为IDataSource的实例
             builder.RegisterType<Sqlserver>().As<IDataSource>();
    
            // 由构造器创建Ioc容器
             using (var container = builder.Build())
             {
                // 解析实例
                 var manager = container.Resolve<DataSourceManager>();   
                Console.WriteLine(manager.GetData());
           Console.ReadLine();
             }
         }
    Autofac基本用法
    • 其他用法:

        ①注册多个接口

         builder.RegisterType<Sqlserver>().AsImplementedInterfaces();

        ②利用反射注册

         Assembly asm = Assembly.Load("DAL.BLL");builder.RegisterAssemblyTypes(asm).AsImplementedInterfaces();

         我们可以在配置文件中将程序集信息在<appSettings>节点中进行配置,来减少对程序集的引用,彻底解除耦合。

        ③利用属性注入 注册

         Assembly asm = Assembly.Load("DAL.BLL");builder.RegisterAssemblyTypes(asm).AsImplementedInterfaces().PropertiesAutowired();

        ④一个接口多个实现

    Assembly asm = Assembly.Load("DAL.BLL");
    builder.RegisterAssemblyTypes(asm).AsImplementedInterfaces();
    using (var container = builder.Build())
    {
        IEnumerable<IDataSource> dals =
               container.Resolve<IEnumerable<IDataSource>>();
    
       foreach(var dal in dals)
       {
           Console.WriteLine(dal.GetData());
       }
        Console.ReadLine();
    }
    
    //也可以通过Named()方法在指定要想获取的类型。
     //获取Autofac容器构造器
            var builder = new ContainerBuilder();
    
            // 注册类型
       builder.RegisterType<DataSourceManager>();
    
            // 注册实例
          builder.RegisterType<Sqlserver>().Named<IDataSource>("SqlServer");
          builder.RegisterType<Sqlserver>().Named<IDataSource>("Oracle");
    
            // 由构造器创建Ioc容器
          using (var container = builder.Build())
          {
                // 解析实例
             var manager = container.ResolveNamed<DataSourceManager>("SqlServer");    
             Console.WriteLine(manager.GetData());
        Console.ReadLine();
          }

    3.2通过配置方式使用Autofac

      通过配置实现Autofac 需要添加对Autofac.Configuration.dll的引用。

    配置文件
    <configuration>
      <configSections>
        <section name="autofac" type="Autofac.Configuration.SectionHandler,Autofac.Configuration"></section>
      </configSections>
      <autofac defaultAssembly="AutoFacDemo">
        <components>
          <component  type="AutoFacDemo.Model.Oracle,AutoFacDemo" service="AutoFacDemo.Model.IDataSource" />
        </components>
      </autofac>
      <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
      </startup>
    </configuration>
    
    C#代码
    var builder = new ContainerBuilder();
    builder.RegisterType<DataSourceManager>();
    builder.RegisterModule(
          new ConfigurationSettingsReader("autofac" ));
    配置

    4.在Asp.net Mvc中使用Autofac

    • 安装
    • 创建配置类
    public class AutofacConfig
    {
        public static void Register()
        {
            var builder = new ContainerBuilder();
            //加载当前程序集
        Assembly controllerAss = Assembly.GetExecutingAssembly();
    
            //Assembly controllerAss = Assembly.Load("OA.Web");
            //注册所有的Controller
            builder.RegisterControllers(controllerAss).PropertiesAutowired();
    
            //注册数据访问层程序集
            Assembly resAss = Assembly.Load("OA.DAL");
            builder.RegisterTypes(resAss.GetTypes()).AsImplementedInterfaces();
    
            //注册业务层程序集
            Assembly bllAss = Assembly.Load("OA.BLL");
            builder.RegisterTypes(bllAss.GetTypes()).AsImplementedInterfaces();
    
            var container = builder.Build();
            //当mvc创建controller对象的时候,都是由AutoFac为我们创建
            //Controller对象
            DependencyResolver.SetResolver(new
                     AutofacDependencyResolver(container));
        }
    }
    创建配置
    • 注册自己的控制类
    在Global.asax 的Application_Start() 注册自己的控制器类
    
    protected void Application_Start()
    {
         AreaRegistration.RegisterAllAreas();
         RouteConfig.RegisterRoutes(RouteTable.Routes);
         //Autofac配置
         AutofacConfig.Register();
    }
    至此,在MVC中使用 Autofac 的配置步骤完成。
     
    在Controller中的使用如下:
    public class HomeController :Controller
    {
    public IDataSource dataSource { get ; set; }
    
    public  ActionResult Index( )
    {
    var data = dataSource.GetData( );
    return View(data);
    }
    }
  • 相关阅读:
    MYSQL利用merge存储引擎来实现分表
    IoC原理及实现
    prometheus + grafana安装部署(centos6.8)
    PHP Laravel定时任务Schedule
    排序算法杂谈(三) —— 归并排序的非递归实现
    排序算法杂谈(二) —— 冒泡排序的递归实现
    排序算法杂谈(一) —— 量化数组的有序程度
    排序算法(七) —— 快速排序
    排序算法(六) —— 归并排序
    排序算法(五) —— 堆排序
  • 原文地址:https://www.cnblogs.com/shishixiang/p/14034383.html
Copyright © 2020-2023  润新知