之前用Ninject,最近因工作需要开始研究Autofac,其实两者都差不多,只是实现方法上有些区别,原理都一样,下面总结一下基础知识。
Autofac是一款IOC框架,它很轻量级性能非常高。(先吹捧一下,提高学习积极性)
控制反转(IOC Inverse of Control) 调用者不再创建被调用者的实例,由autofac框架实现(容器创建)所以成为控制反转。比如你用抽象引用(接口或抽象类)指向具体实现类的实例,你要创建实例(这是一个多态的概念),但有了IOC之后,你不用操心这些事了,由IOC框架来干,你只管拿着接口引用来用就成。
依赖注入(DI Dependence injection) 容器创建好实例后再注入调用者称为依赖注入。 当然,上边你用着是方便了,前提是需要完成框架的一些简单的操作,这些操作就是依赖注入。即建立接口或抽象类与实现之间的关联关系。
安装 Autofac install-package Autofac
1.关键方法说明
(1)扫描类型 RegisterAssemblyTypes(接受1个或多个程序集的数组),程序集必须是public
(1.1)过滤类型 Where()
如: builder.RegisterAssemblyTypes(Assembly.LoadFile(servicesDllFile))
.Where(t=>t.Name.EndsWith("Services"))
(1.2)排除类型 Except()
如: builder.RegisterAssemblyTypes(Assembly.LoadFile(servicesDlFile)
.Except<MyType>(ct=>ct.As<ISpecial>().SingleInstance());
AsImplementedInterfaces() :表示注册的类型,以接口的方式注册,但不包括IDisposable()接口
builder.RegisterAssemblyTypes(Assembly.LoadFile(servicesDllFile))
.Where(t=>t.Name.EndWith("Repository"))
.AsImplementedInterfaces();
AsClosedTypesOf(open) 可分配给注册类一个接近开放反省类型的实例
builder.RegisterAssemblyTypes(Assembly.LoadFile(ServiceDllFile))
.AsClosedTypesOf(type(IRepository))
AsSelf 默认,注册类型本身--当重写其他服务默认规范时非常有用
builder.RegisterAssemblyTypes(Assembly.LoadFile(serviceDllFile))
.AsImplementedInterfaces()
.AsSelf();
2.扫描模块 RegisterAssemblyModules()注册方法,它通过Autofac模块提供的程序集扫描,创建模块实例,然后使用当前container builder注册他们,使用
System.Web.Compilation.BuilderManager中的GetReferecedAssemblies()方法,会得到一个引用程序集列表.
var assemblies=BuilderManager.GetReferencedAssemblies().Cast<Assembly>();
注入方法1
var builder=new ContainerBuilder();
builder.RegisterType<TestService>();
builder.RegisterType<TestDAL>().As<ITestDAL>()
return builder.Builder();
方法2 为了统一管理IOC相关代码,并避免在底层类库中到处引用Autofac这个第三方组件,定义了一个专门用于管理需要依赖注入的接口与实现类的空接口IDependency。
public interface IDependency
{
}
这个接口没有任何方法,不会对系统的业务逻辑造成污染,所以需要进行以来注入的接口,都要集成这个空接口。