准备:

  1. public interface IDAL
  2. {
  3. void Insert(string commandText);
  4. }
  5. public class SqlDAL : IDAL
  6. {
  7. public void Insert(string commandText)
  8. {
  9. Console.WriteLine("使用sqlDAL添加相关信息");
  10. }
  11. }
  12. public class OracleDAL : IDAL
  13. {
  14. public void Insert(string commandText)
  15. {
  16. Console.WriteLine("使用OracleDAL添加相关信息");
  17. }
  18. }
  19. public class DBManager
  20. {
  21. IDAL _dal;
  22. private string Name;
  23. public DBManager(IDAL dal)
  24. {
  25. _dal = dal;
  26. }
  27. public DBManager(string name, IDAL _dal)
  28. {
  29. Name = name;
  30. this._dal = _dal;
  31. }
  32. public void Add(string commandText)
  33. {
  34. _dal.Insert($"Name-{Name}:{commandText}");
  35. }
  36. }

  

2,应用

  1. var builder = new ContainerBuilder();
           //注册类型
  2. builder.RegisterType<DBManager>();
           //注册类型及其实例
  3. builder.RegisterType<SqlDAL>().As<IDAL>();
  4.  
  5. //命名注册
  6. builder.RegisterType<SqlDAL>().Named<IDAL>("sql");
  7. builder.RegisterType<OracleDAL>().Named<IDAL>("oracle");
  8.  
  9. using (var container = builder.Build())
  10. {
  11. var manager = container.Resolve<DBManager>();
  12. manager.Add("INSERT INTO Persons VALUES ('Man', '25', 'WangW', 'Shanghai')");
  13.  
  14. SqlDAL sqlDAL = (SqlDAL)container.ResolveNamed<IDAL>("sql");
  15. OracleDAL oracleDAL = (OracleDAL)container.ResolveNamed<IDAL>("oracle");
  16.  
  17. //在解析实例时给其赋值
  18. var manager1 = container.Resolve<DBManager>(new NamedParameter("name", "SQL"));
  19. manager.Add("INSERT INTO Persons VALUES ('Man', '25', 'WangW', 'Shanghai')");
  20. }

  常用方法:

AutoFac常用方法说明

(1)builder.RegisterType<Object>().As<Iobject>():注册类型及其实例。例如下面就是注册接口IDAL的实例SqlDAL

  1. ContainerBuilder builder = new ContainerBuilder();
  2. builder.RegisterType<SqlDAL>().As<IDAL>();
  3. IContainer container = builder.Build();
  4. SqlDAL sqlDAL = (SqlDAL)container.Resolve<IDAL>();

(2)IContainer.Resolve<IDAL>():解析某个接口的实例。例如上面的最后一行代码就是解析IDAL的实例SqlDAL

(3)builder.RegisterType<Object>().Named<Iobject>(string name):为一个接口注册不同的实例。有时候难免会碰到多个类映射同一个接口,比如SqlDAL和OracleDAL都实现了IDAL接口,为了准确获取想要的类型,就必须在注册时起名字。

  1. builder.RegisterType<SqlDAL>().Named<IDAL>("sql");
  2. builder.RegisterType<OracleDAL>().Named<IDAL>("oracle");
  3. IContainer container = builder.Build();
  4. SqlDAL sqlDAL = (SqlDAL)container.ResolveNamed<IDAL>("sql");
  5. OracleDAL oracleDAL = (OracleDAL)container.ResolveNamed<IDAL>("oracle");

(4)IContainer.ResolveNamed<IDAL>(string name):解析某个接口的“命名实例”。例如上面的最后一行代码就是解析IDAL的命名实例OracleDAL

(5)builder.RegisterType<Object>().Keyed<Iobject>(Enum enum):以枚举的方式为一个接口注册不同的实例。有时候我们会将某一个接口的不同实现用枚举来区分,而不是字符串,例如:

  1. public enum DBType{ Sql, Oracle}
  1. builder.RegisterType<SqlDAL>().Keyed<IDAL>(DBType.Sql);
  2. builder.RegisterType<OracleDAL>().Keyed<IDAL>(DBType.Oracle);
  3. IContainer container = builder.Build();
  4. SqlDAL sqlDAL = (SqlDAL)container.ResolveKeyed<IDAL>(DBType.Sql);
  5. OracleDAL oracleDAL = (OracleDAL)container.ResolveKeyed<IDAL>(DBType.Oracle);

(6)IContainer.ResolveKeyed<IDAL>(Enum enum):根据枚举值解析某个接口的特定实例。例如上面的最后一行代码就是解析IDAL的特定实例OracleDAL

(7)builder.RegisterType<Worker>().InstancePerDependency():用于控制对象的生命周期,每次加载实例时都是新建一个实例,默认就是这种方式

(8)builder.RegisterType<Worker>().SingleInstance():用于控制对象的生命周期,每次加载实例时都是返回同一个实例

(9)IContainer.Resolve<T>(NamedParameter namedParameter):在解析实例T时给其赋值

3,Asp.net MVC中应用

引入Autofac.Integration.Mvc.dll

  1. var builder = new ContainerBuilder();
  2. builder.RegisterType<SqlDAL>().As<IDAL>();
  3. builder.RegisterControllers(Assembly.GetExecutingAssembly());
  4. var container = builder.Build();
  5. DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

  Controller中应用

  1. private IDAL iDal;
  2. public HomeController(IDAL iDal)
  3. {
  4. this.iDal = iDal;
  5. }

  

Autofac应用总结的更多相关文章

  1. AutoFac在项目中的应用

    技能大全:http://www.cnblogs.com/dunitian/p/4822808.html#skill 完整Demo:https://github.com/dunitian/LoTCode ...

  2. Autofac - MVC/WebApi中的应用

    Autofac前面写了那么多篇, 其实就是为了今天这一篇, Autofac在MVC和WebApi中的应用. 一.目录结构 先看一下我的目录结构吧, 搭了个非常简单的架构, IOC(web), IBLL ...

  3. Autofac - 生命周期

    实例生命周期决定在同一个服务的每个请求的实例是如何共享的. 当请求一个服务的时候,Autofac会返回一个单例 (single instance作用域), 一个新的对象 (per lifetime作用 ...

  4. Autofac - 属性注入

    属性注入不同于通过构造函数方式传入参数. 这里是通过注入的方式, 在类创建完毕之后, 资源释放之前, 给属性赋值. 这里, 我重新弄一些类来演示这一篇吧. public class ClassA { ...

  5. Autofac 的点滴

    泛型类型的注册和使用 public interface IRepository<T> where T:class { } public interface ISchoolDetailRep ...

  6. ASP.NET Core 整合Autofac和Castle实现自动AOP拦截

    前言: 除了ASP.NETCore自带的IOC容器外,我们还可以使用其他成熟的DI框架,如Autofac,StructureMap等(笔者只用过Unity,Ninject和Castle). 1.ASP ...

  7. Autofac 的属性注入,IOC的坑

    Autofac 是一款优秀的IOC的开源工具,完美的适配.Net特性,但是有时候我们想通过属性注入的方式来获取我们注入的对象,对不起,有时候你还真是获取不到,这因为什么呢? 1.你对Autofac 不 ...

  8. Autofac 组件、服务、自动装配 《第二篇》

    一.组件 创建出来的对象需要从组件中来获取,组件的创建有如下4种(延续第一篇的Demo,仅仅变动所贴出的代码)方式: 1.类型创建RegisterType AutoFac能够通过反射检查一个类型,选择 ...

  9. 使用Adminlite + ASP.NET MVC5(C#) + Entityframework + AutoFac + AutoMapper写了个api接口文档管理系统

    一.演示: 接口查看:http://apidoc.docode.top/ 接口后台:http://apiadmin.docode.top/ 登录:administrator,123456 二.使用到的 ...

  10. autofac 组件的实例范围

    实例范围决定如何在请求之间共享服务. 原文地址:http://docs.autofac.org/en/latest/lifetime/instance-scope.html 每个依赖一个实例 使用这个 ...

随机推荐

  1. 【Java】Java复习笔记-第二部分

    类和对象 类:主观抽象,是对象的模板,可以实例化对象 习惯上类的定义格式: package xxx; import xxx; public class Xxxx { 属性 ······; 构造器 ·· ...

  2. vue2.0如何自定义全局变量的方法

    方法一:http://www.jianshu.com/p/04dffe7a6b74 //在mian.js中写入函数 Vue.prototype.changeData = function (){ al ...

  3. Mysql下SELECT的结果集作为UPDATE的WHERE条件时的SQL语法

    UPDATE `WarningSendMail` AS alias_1 INNER JOIN (SELECT * FROM `WarningSendMail` WHERE flag=1 AND top ...

  4. uboot——之初体验

    官方下载地址:ftp://ftp.denx.de/pub/u-boot/ uboot的终极奥义就是启动内核. 但是,现在,我们先做最基本的,去官网下载一个支持自己板子的uboot,然后解压缩,打补丁. ...

  5. Wireshark抓包工具HttpAnalyzerStdV7

    http.request.full_uri contains "XXXserver/api/" http.host contains "XXX5.单位.com"

  6. 基于jQuery适合做图片类网站的特效

    分享一款基于jquery适合做图片类网站的特效.这是一款鼠标经过图片滑动弹出标题效果代码.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div class="c ...

  7. Android 两级菜单栏

    这里来记录下,android 的两级菜单栏,就是顶部切换,和底部的切换.因为在这个上面整了太久的时间,所以特此记录下. 第一种: 先介绍一个网上别人写出来的效果吧,这个当时积分真的很高..CSDN30 ...

  8. Android webView输出自定义网页

    这次来使用webview输出网页型数据.因为这样的数据好使用富文本编辑器,有各种各样的拓展. 上代码: package controller.hzl.com.testcall; import andr ...

  9. [转]PowerDesigner中name和code取消自动关联

    PowerDesigner中,但修改了某个字段的name,其code也跟着修改,这个问题很讨厌,因为一般来说,name是中文的,code是字段名. 解决方法如下: 1.选择Tools->Gene ...

  10. 关于dubbo的provider和consumer都配置timeout超时时间的情况

    本文转自:http://blog.csdn.net/lkforce/article/details/54380201 前言 在dubbo的provider和consumer的配置文件中,如果都配置了t ...