Autofac是一个为微软.NET服务的Ico容器,它管理者类与类之间的依赖关系,因而可以使得应用程序在规模和复杂度不断增长中保持易改的特性。下面是通过处理.NET的一般类来获取的组件。


添加组件
组件通过ContainerBuilder被注册:
var builder = new ContainerBuilder();


Autofac 可以使用一个Linq表达式、一个类型,或者一个预编译的实例来作为一个组件:
builder.Register(c=>new TaskController(c.Resolve<ITaskRepository>()));
builder.RegisterType<TaskController>();
builder.TegisterInstance(new TaskController());


或者,Autofac可以找到和注册组件类型在一个程序集中:
builder.RegisterAssemblyTypes(controllerAssembly);


调用Build()创建一个容器:
var container = new builder.Build();


为了从容器中获取一个组件的实例,必须使用一个服务。默认的,组件提供他们的具体类型来作为一个服务:
var taskController = container.Resolve<TaskController>();


为了制定组件服务是某一接口,As()方法将用于注册时之指定:
builder.RegisterTye<TaskController>().As<TController>();
var taskController = container.Resolve<IController>();


表达依赖关系
当Autofac实例化一个组件时,他通过查找和实例化其他组件满足了组件的依赖关系。组件表达他们依赖关系到Autofac作为一个构造参数:
public class TaskConteoller:IController
{
     public TaskController(ITaskRepository tasks){...}
}


在上面的例子中Autofac将会查找另外一个提供ITaskRepository服务的组件并且调用了改组件作为一个参数的TaskController的构造函数、
如果在组件类型中有超过一个构造方法,Autofac将会使用最多可解析参数的构造方法:
public TaskController(ITaskRepository tasks)
public TaskController(ITaskRepository tasks, ILog log)


默认参数值可以用于表达可选依赖
public TaskController(ITaskRepository tasks, ILog log=null)


泛型引用可以被用于通过声明泛类型来构造
public TaskController(Lazy<ITaskRepository> tasks)


Autofac能够了解高级的关系类型,像Lazy<T>,Func<T>,IEnumerable<T>还有其它的,来改变组件和它依赖之间的关系。


优势
Autofac尽可能的保持了对设计方式约束。
简单的扩展点:事件触发像OnActivating(e=>e.Instance.Start())可以使用很少的代码获取很多自定义。
健壮的资源管理:Autofac负责追踪可被释放组件来保证应该被释放资源的处理。
灵活的模块系统:打破了从XML配置和使用Autofac描述代码之间的平衡。


现状
2.5版本是默认支持的版本。开发只需要一个大约100KB的程序集。如果需要注释版本,请转到blog of Nicholas Blumhardt.


使用Autofac有一个增长的数字集,支持多个主流框架。


 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐