zoukankan      html  css  js  c++  java
  • 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);
    }
    }
  • 相关阅读:
    如何通过命令行窗口查看sqlite数据库文件
    eclipse自动补全的设置
    文本装饰
    注释和特殊符号
    文本装饰
    网页背景
    通过ArcGIS Server admin 查看和删除已注册的 Web Adaptor
    通过 ArcGIS Server Manager 查看已安装的 Web Adaptor
    通过 ArcGIS Server Manager 验证 DataStore
    Windows上安装ArcGIS Enterprise——以 Windows Server 2012 R2上安装 ArcGIS 10.8为例
  • 原文地址:https://www.cnblogs.com/shishixiang/p/14034383.html
Copyright © 2011-2022 走看看