Autofac是比较出名的Ioc容器之一,熟悉Orchard的应该熟知。本文直接介绍autofac用法
一、开始
1、NuGet添加或者直接http://code.google.com/p/autofac/wiki/NewInV2
2、资源:
http://www.codeproject.com/Articles/25380/Dependency-Injection-with-Autofac
http://www.cnblogs.com/wolegequ/tag/autofac/
使用AutoFac需引用AutoFac.dll.如果想使用XML配置,还需要引用Autofac.Configuration.dll.
autofac最常用的解耦方式是从构造器或者属性注入实现ioc
二、用法总括
1 注册服务
RegisterType<T>()//注册类型T
AsImplementedInterfaces()//表示注册的类型,以接口的方式注册
Build()//创建一个容器
var builder=new ContainerBuilder();
(1)builder.RegisterType<ConsoleLogger>().As<ILogger>();
(2) builder.RegisterType<A>();
(3) builder.RegisterType(typeof(A));
(4) builder.Register(c=>new A(c.Resoler<B>()));
(4.1)builder.Register(c => new UserSession(DateTime.Now.AddMinutes(25))); //带复杂参数的构造(构造函数的参数不能使用简单的常量定义)
(5)builder.Registe(c=>new A(){MyB=c.ResolverOptional<B>()}); //属性注入
(6)根据参数来选择实现的对象
builder.Register<CreditCard>((c, p) => {
var accountId = p.Named<string>("accountId");
if (accountId.StartsWith("9"))
return new GoldCard(accountId);
else
return new StandardCard(accountId);
(7) 对已存在的单例进行注入 builder.RegisterInstance(MySingleton.Instance).ExternallyOwned();
(8) builder.RegisterGeneric(typeof(NHibernateRepository<>))
.As(typeof(IRepository<>))
.InstancePerLifetimeScope();
(9) builder.Register<X2>().As<IX>().PreserveExistingDefaults();
//使用已存在的注册
(10)builder.RegisterModule(new ConfigurationSettingsReader("autofac"));配置文件注册
2、ContainnerBuilder创建实例
1)、InstancePerDependency
对每一个依赖或每一次调用创建一个新的唯一的实例。这也是默认的创建实例的方式。
2)、InstancePerLifetimeScope
在一个生命周期域中,每一个依赖或调用创建一个单一的共享的实例,且每一个不同的生命周期域,实例是唯一的,不共享的。
3)、InstancePerMatchingLifetimeScope
在一个做标识的生命周期域中,每一个依赖或调用创建一个单一的共享的实例。打了标识了的生命周期域中的子标识域中可以共享父级域中的实例。若在整个继承层次中没有找到打标识的生命周期域,则会抛出异常:DependencyResolutionException。
4)、InstancePerOwned
在一个生命周期域中所拥有的实例创建的生命周期中,每一个依赖组件或调用Resolve()方法创建一个单一的共享的实例,并且子生命周期域共享父生命周期域中的实例。若在继承层级中没有发现合适的拥有子实例的生命周期域,则抛出异常:DependencyResolutionException。
5)、SingleInstance
每一次依赖组件或调用Resolve()方法都会得到一个相同的共享的实例。其实就是单例模式。
6)、InstancePerHttpRequest
在一次Http请求上下文中,共享一个组件实例。仅适用于asp.net mvc开发。官方文档解释:Share one instance of the component within the context of a single HTTP request.