依赖注入容器Autofac的详解
Autofac和其他容器的不同之处是它和C#语言的结合非常紧密,在使用过程中对你的应用的侵入性几乎为零,更容易与第三方的组件集成,并且开源,Autofac的主要特性如下:
1,灵活的组件实例化:Autofac支持自动装配,给定的组件类型Autofac自动选择使用构造函数注入或者属性注入,Autofac还可以基于lambda表达式创建实例,这使得容器非常灵活,很容易和其他的组件集成。
2,资源管理的可视性:基于依赖注入容器构建的应用程序的动态性,意味着什么时候应该处理那些资源有点困难。Autofac通过容器来跟踪组件的资源管理。对于不需要清理的对象,例如Console.Out,我们调用ExternallyOwned()方法告诉容器不用清理。细粒度的组件生命周期管理:应用程序中通常可以存在一个应用程序范围的容器实例,在应用程序中还存在大量的一个请求的范围的对象,例如一个HTTP请求,一个IIS工作者线程或者用户的会话结束时结束。通过嵌套的容器实例和对象的作用域使得资源的可视化。
3,Autofac的设计上非常务实,这方面更多是为我们这些容器的使用者考虑:
●组件侵入性为零:组件不需要去引用Autofac。
●灵活的模块化系统:通过模块化组织你的程序,应用程序不用纠缠于复杂的XML配置系统或者是配置参数。
●自动装配:可以是用lambda表达式注册你的组件,autofac会根据需要选择构造函数或者属性注入
●XML配置文件的支持:XML配置文件过度使用时很丑陋,但是在发布的时候通常非常有用
Autofac的简单使用,并加入了Repository模式.
定义两个简单实体类:
- public class Persion
- {
- public string Name { get; set; }
- public int Age { get; set; }
- }
- public class Custom
- {
- public string CustomName { get; set; }
- public int CustomID { get; set; }
- }
定义泛型数据库访问接口:
- public interface Idal<T> where T:class
- {
- void Insert(T entity);
- void Update(T entity);
- void Delete(T entity);
- }
泛型数据库访问接口的泛型实现:
- public class Dal<T>:Idal<T> where T : class
- {
- #region Idal<T> Members
- public void Insert(T entity)
- {
- HttpContext.Current.Response.Write("您添加了一个:"
- +entity.GetType().FullName);
- }
- public void Update(T entity)
- {
- HttpContext.Current.Response.Write("您更新一个:"
- +entity.GetType().FullName);
- }
- public void Delete(T entity)
- {
- HttpContext.Current.Response.Write("您删除了一个:"
- +entity.GetType().FullName);
- }
- #endregion
- }
使用Repository模式实现访问。
Repository的泛型接口:
- public interface IRepository<T> where T:class
- {
- void Insert(T entity);
- void Update(T entity);
- void Delete(T entity);
- }
Repository泛型接口的泛型实现:
- public class Repository<T>:IRepository<T> where T:class
- {
- private Idal<T> _dal;
- public Repository(Idal<T> dal)
- {
- _dal = dal;
- }
- #region IRepository<T> Members
- public void Insert(T entity)
- {
- _dal.Insert(entity);
- }
- public void Update(T entity)
- {
- _dal.Update(entity);
- }
- public void Delete(T entity)
- {
- _dal.Delete(entity);
- }
- #endregion
- }
IDependency的依赖接口,不需要任何方法体,所有的业务对象都实现该接口
- public interface IDependency
- {
- }
实现IDependency接口的CustomBll类,通过Repository模式存储数据。
- public class CustomBll:IDependency
- {
- private readonly IRepository<Custom> _repository;
- public CustomBll(IRepository<Custom> repository)
- {
- _repository = repository;
- }
- public void Insert(Custom c)
- {
- _repository.Insert(c);
- }
- public void Update(Custom c)
- {
- _repository.Update(c);
- }
- public void Delete(Custom c)
- {
- _repository.Delete(c);
- }
- }
实现IDependency接口的PersionBll类,通过Repository模式存储数据。
- public class PersionBll:IDependency
- {
- private readonly IRepository<Persion> _repository;
- public PersionBll(IRepository<Persion> repository)
- {
- _repository = repository;
- }
- public void Insert(Persion p)
- {
- _repository.Insert(p);
- }
- public void Update(Persion p)
- {
- _repository.Update(p);
- }
- public void Delete(Persion p)
- {
- _repository.Delete(p);
- }
- }
下面编写组件实例化测试
- var builder = new ContainerBuilder();
- builder.RegisterGeneric(typeof(Dal<>)).As(typeof(Idal<>))
- .InstancePerDependency();
- builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepository<>))
- .InstancePerDependency();
- builder.Register(c=>new PersionBll((IRepository<Persion>)
- c.Resolve(typeof(IRepository<Persion>))));
- builder.Register(c => new CustomBll((IRepository<Custom>)
- c.Resolve(typeof(IRepository<Custom>))));
- //var container = builder.Build()教程里都是使用这行代码,
- //我本地测试需要加入ContainerBuildOptions枚举选项。
- using (var container = builder.Build(ContainerBuildOptions.None))
- {
- // var repository= container.Resolve(typeof(IRepository<Persion>),new TypedParameter());
- // IRepository<Persion> _repository = repository as Repository<Persion>;
- // var m = new PersionBll(_repository);
- Persion p = new Persion();
- p.Name = "小人";
- p.Age = ;
- var m = container.Resolve<PersionBll>();
- m.Insert(p);
- Custom c = new Custom();
- c.CustomName = "小小";
- c.CustomID = ;
- var cc = container.Resolve<CustomBll>();
- cc.Update(c);
- }
这里通过ContainerBuilder方法RegisterGeneric对泛型类进行注册(当然也可以通过ContainerBuilder方法RegisterType对不是泛型的类进行注册),当注册的类型在相应得到的容器中可以Resolve你的类实例。
builder.RegisterGeneric(typeof(Dal<>)).As(typeof(Idal<>)).InstancePerDependency();通过AS可以让类中通过构造函数依赖注入类型相应的接口。(当然也可以使用builder.RegisterType<类>().As<接口>();来注册不是泛型的类 )
Build()方法生成一个对应的Container实例,这样,就可以通过Resolve解析到注册的类型实例。
注:如果要获得某个泛型的实例,需要将泛型T代表的类传进去。如上c.Resolve(typeof(IRepository<Persion>))返回的是Object,需要转换为响应的接口。
当然可以使用autofac的新特性RegisterAssemblyTypes,从一个程序集的注册类型设置根据用户指定的规则,例子如下:
- var builder = new ContainerBuilder();
- builder.RegisterGeneric(typeof(Dal<>)).As(typeof(Idal<>)).InstancePerDependency();
- builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepository<>)).InstancePerDependency();
- //上面的那些类如果在单独的工程里,如生成的程序集为AutofacUnitTest,就可以使用
- //Assembly.Load("AutofacUnitTest")获得响应的程序集。如果所有的文件在一个控制台程序里,
- //可以通过Assembly.GetExecutingAssembly(); 直接获得相应的程序集。
- Assembly dataAccess = Assembly.Load("AutofacUnitTest");
- builder.RegisterAssemblyTypes(dataAccess)
- .Where(t => typeof(IDependency).IsAssignableFrom(t) && t.Name.EndsWith("Bll"));
- //RegisterAssemblyTypes方法将实现IDependency接口并已Bll结尾的类都注册了,语法非常的简单。
依赖注入容器Autofac的详解的更多相关文章
- 依赖注入容器Autofac与MVC集成
Autofac是应用于.Net平台的依赖注入(DI,Dependency Injection)容器,具有贴近.契合C#语言的特点.随着应用系统的日益庞大与复杂,使用Autofac容器来管理组件之间的关 ...
- 深入浅出依赖注入容器——Autofac
1.写在前面 相信大家对IOC和DI都耳熟能详,它们在项目里面带来的便利大家也都知道,微软新出的.NetCore也大量采用了这种手法. 如今.NetCore也是大势所趋了,基本上以.Net为技术主导的 ...
- Spring依赖注入三种方式详解
在讲解Spring依赖注入之前的准备工作: 下载包含Spring的工具jar包的压缩包 解压缩下载下来的Spring压缩包文件 解压缩之后我们会看到libs文件夹下有许多jar包,而我们只需要其中的c ...
- Spring依赖注入(DI)详解
一.依赖简介 一个典型的企业应用程序不是由一个单一的对象组成(或Spring的说法中的bean).即使是最简单的应用程序也只有几个对象一起工作来呈现最终用户看作是一个连贯的应用程序.如何从定义许多独立 ...
- Spring——依赖注入(DI)详解
声明:本博客仅仅是一个初学者的学习记录.心得总结,其中肯定有许多错误,不具有参考价值,欢迎大佬指正,谢谢!想和我交流.一起学习.一起进步的朋友可以加我微信Liu__66666666 这是简单学习一遍之 ...
- 依赖注入容器-- Autofac
目录: 一.简介 二.如何使用 2.1.基本使用 2.2.接口使用 2.3. 其他注入 2.4. 注入的生命周期 一.简介 在上一篇文章中讲到替换默认服务容器,我们选择了Autofac Autofac ...
- Vue.js 源码分析(八) 基础篇 依赖注入 provide/inject组合详解
先来看看官网的介绍: 简单的说,当组件的引入层次过多,我们的子孙组件想要获取祖先组件的资源,那么怎么办呢,总不能一直取父级往上吧,而且这样代码结构容易混乱.这个就是这对选项要干的事情 provide和 ...
- Autofac依赖注入容器
依赖注入容器-- Autofac https://github.com/danielpalme/IocPerformance Unity 更新频率高,微软的项目Grace 综合性能更高 目录: 一.简 ...
- Asp.Net Core 进阶(三)—— IServiceCollection依赖注入容器和使用Autofac替换它
Asp.Net Core 提供了默认的依赖注入容器 IServiceCollection,它是一个轻量级的依赖注入容器,所以功能不多,只是提供了基础的一些功能,要实现AOP就有点麻烦,因此在实际工作当 ...
随机推荐
- CStdioFile
CStdioFile类的声明保存再afx.h头文件中. CStdioFile类继承自CFile类,CStdioFile对象表示一个用运行时的函数fopen打开的c运行时的流式文件.流式文件是被缓冲的, ...
- ASP.NET MVC- KindEditor的使用
我用过几个EDITOR,还是比较喜欢KINDEDITOR.这个工作可能最近要用到了,周末在家花时间了解了一下.做了一下备注在这里,以备日后方便查阅. 1.首先去KINDEDITOR的官网下载最新的版本 ...
- 阿里聚安全攻防挑战赛第三题Android PwnMe解题思路
阿里聚安全攻防挑战赛第三题Android PwnMe解题思路 大家在聚安全挑战赛正式赛第三题中,遇到android app 远程控制的题目.我们今天带你一探究竟,如何攻破这道题目. 一.题目 购物应用 ...
- jquery 应用小结
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- ADO与ADO.NET的区别
ADO是使用ole db接口并基于微软的COM技术,ADO.NET使用自己的ADO.NET接口并基于微软的.NET体系架构,所以ADO.NET与ADO是两种数据访问方式. ADO以recordset存 ...
- Combox和DropDownList控件的区别
共同点:都是下拉框控件 不同点:Combox用在winform上,DropDownList用在网页上,且两者绑定方式略有不同 绑定数据例子如下—— 1.Combox绑定 DataTable dtBus ...
- STM32 + RT Thread OS 学习笔记[三]
RTGUI 据说RTGUI是多线程的,因此与RT-Thread OS的耦合度较高,有可能要访问RT-Thread的线程控制块.如果要移植到其它OS,估计难度较大.目前还处于Alpha状态,最终将会包含 ...
- NoSQL 数据建模技术(转)
本文转载自:http://coolshell.cn/articles/7270.html ================================================ 全文译自墙外 ...
- OSG中找到特定节点的方法(转)
OSG中找到特定节点的方法 为了在OSG中找到需要的节点并对节点做出相应的操作,可以从NodeVisitor类中继承一个类,NPS的教程 [download id="14"] 阐述 ...
- C++ 内存泄露处理方法 (转)
1.可以显示内存泄露情况,但无法找到具体的文件位置写法 包含头文件#include <crtdbg.h> 然后在需要检测内存泄露的位置加上语句 _CrtDumpMemoryLeaks(); ...