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);
}
}
原文地址:https://www.cnblogs.com/shishixiang/p/14034383.html