Autofac是一款IOC框架,比较于其余的IOC框架,如Spring.NET,Unity,Castle等等所包含的,它很轻量级性能上很是高。html
官方网站http://autofac.org/git
源码下载地址https://github.com/autofac/Autofacgithub
最新版本下载能够看到,包括源码,示例文档,与之相关的测试项目,生成的DLL文件,其余文档express
关于控制反转和依赖注入的文章和书籍不少,对其定义也解释的也仁者见仁,这里就不赘述了,这是本人(只表明我的观点)的理解:mvc
Install-Package Autofac
官方使用简单介绍:app
Components are registered with a ContainerBuilder
:框架
var builder = new ContainerBuilder();
Autofac can use a Linq expression, a .NET type, or a pre-built instance as a component:asp.net
builder.Register(c => new TaskController(c.Resolve<ITaskRepository>()));
builder.RegisterType<TaskController>();
builder.RegisterInstance(new TaskController());
Or, Autofac can find and register the component types in an assembly:ide
builder.RegisterAssemblyTypes(controllerAssembly);
Calling Build()
creates a container:post
var container = builder.Build();
To retrieve a component instance from a container, a service is requested. By default, components provide their concrete type as a service:
var taskController = container.Resolve<TaskController>();
To specify that the component’s service is an interface, the As()
method is used at registration time:
builder.RegisterType<TaskController>().As<IController>();
// enabling
var taskController = container.Resolve<IController>();
var builder = new ContainerBuilder(); builder.RegisterType<TestService>(); builder.RegisterType<TestDao>().As<ITestDao>(); return builder.Build();
为了统一管理 IoC 相关的代码,并避免在底层类库中处处引用 Autofac 这个第三方组件,定义了一个专门用于管理须要依赖注入的接口与实现类的空接口 IDependency:
/// <summary> /// 依赖注入接口,表示该接口的实现类将自动注册到IoC容器中 /// </summary> public interface IDependency { }
这个接口没有任何方法,不会对系统的业务逻辑形成污染,全部须要进行依赖注入的接口,都要继承这个空接口,例如:
业务单元操做接口:
/// <summary> /// 业务单元操做接口 /// </summary> public interface IUnitOfWork : IDependency { ... }
Autofac 是支持批量子类注册的,有了 IDependency 这个基接口,咱们只须要 Global 中很简单的几行代码,就能够完成整个系统的依赖注入匹配:
ContainerBuilder builder = new ContainerBuilder(); builder.RegisterGeneric(typeof(Repository<,>)).As(typeof(IRepository<,>)); Type baseType = typeof(IDependency); // 获取全部相关类库的程序集 Assembly[] assemblies = ... builder.RegisterAssemblyTypes(assemblies) .Where(type => baseType.IsAssignableFrom(type) && !type.IsAbstract) .AsImplementedInterfaces().InstancePerLifetimeScope();//InstancePerLifetimeScope 保证对象生命周期基于请求 IContainer container = builder.Build(); DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
如此,只有站点主类库须要引用 Autofac,而不是处处都存在着注入的相关代码,大大下降了系统的复杂度。
参考:http://www.cnblogs.com/guomingfeng/p/osharp-layer.html
对每个依赖或每一次调用建立一个新的惟一的实例。这也是默认的建立实例的方式。
官方文档解释:Configure the component so that every dependent component or call to Resolve() gets a new, unique instance (default.)
在一个生命周期域中,每个依赖或调用建立一个单一的共享的实例,且每个不一样的生命周期域,实例是惟一的,不共享的。
官方文档解释:Configure the component so that every dependent component or call to Resolve() within a single ILifetimeScope gets the same, shared instance. Dependent components in different lifetime scopes will get different instances.
在一个作标识的生命周期域中,每个依赖或调用建立一个单一的共享的实例。打了标识了的生命周期域中的子标识域中能够共享父级域中的实例。若在整个继承层次中没有找到打标识的生命周期域,则会抛出异常:DependencyResolutionException。
官方文档解释:Configure the component so that every dependent component or call to Resolve() within a ILifetimeScope tagged with any of the provided tags value gets the same, shared instance. Dependent components in lifetime scopes that are children of the tagged scope will share the parent's instance. If no appropriately tagged scope can be found in the hierarchy an DependencyResolutionException is thrown.
在一个生命周期域中所拥有的实例建立的生命周期中,每个依赖组件或调用Resolve()方法建立一个单一的共享的实例,而且子生命周期域共享父生命周期域中的实例。若在继承层级中没有发现合适的拥有子实例的生命周期域,则抛出异常:DependencyResolutionException。
官方文档解释:
Configure the component so that every dependent component or call to Resolve() within a ILifetimeScope created by an owned instance gets the same, shared instance. Dependent components in lifetime scopes that are children of the owned instance scope will share the parent's instance. If no appropriate owned instance scope can be found in the hierarchy an DependencyResolutionException is thrown.
每一次依赖组件或调用Resolve()方法都会获得一个相同的共享的实例。其实就是单例模式。
官方文档解释:Configure the component so that every dependent component or call to Resolve() gets the same, shared instance.
在一次Http请求上下文中,共享一个组件实例。仅适用于asp.net mvc开发。
参考连接:
autofac 建立实例方法总结:http://www.cnblogs.com/manglu/p/4115128.html
AutoFac使用方法总结:Part I:http://niuyi.github.io/blog/2012/04/06/autofac-by-unit-test/