Autofac使用总结

Autofac学习笔记:
1、创建builder,直接new 就可以了
var builder = new ContainerBuilder();

2、注册接口以及实现类到builder
可以通过程序集来注册
Assembly[] assemblies = BuildManager.GetReferencedAssemblies().Cast<Assembly>().Where(p => p.FullName.Contains
("Ye.Service")).ToArray();
builder.RegisterAssemblyTypes(assemblies).AsImplementedInterfaces().InstancePerLifetimeScope();

3、也可以注册自己的Module
继承类Module,重写Load(ContainerBuilder builder)方法,然后,在自己的builder里面注册模块
builder.RegisterModule<MyAdbApp.App_Start.AutofacModule>();

4、取接口实例
var container = builder.Build();
//A
var a = container.ResolveOptional(typeof(IAddService));
//B
var obj1 = container.Resolve<IAddService>();
A,B两种方式的区别在于,前者如果该接口没有注册,会返回null,后者直接报错

5、对于同一个接口的不同实例,需要用到子类的名称来注入,需要加上一句:
builder.RegisterSource(new AnyConcreteTypeNotAlreadyRegisteredSource(t => t.IsAssignableTo<ICommand>()));
其中ICommand是接口名称,该句最好写在Module子类的Load方法里面

6、声明生命周期的方法
builder.RegisterAssemblyTypes(assemblies).AsImplementedInterfaces().InstancePerLifetimeScope();
默认是每取一次对象,都会new一个新的实例
SingleInstance是单例;

InstancePerLifetimeScope是同一个lifetime生成的是同一个对象;

Per Dependency 默认,瞬态的,每次请求就会生成一个新的对象;

InstancePerMatchingLifetimeScope 在一个做标识的生命周期域中,每一个依赖或调用创建一个单一的共享的实例;

PerOwned 在一个生命周期域中所拥有的实例创建的生命周期中,每一个依赖组件或调用Resolve()方法创建一个单一的共享的实例,并且子生命周
期域共享父生命周期域中的实例。若在继承层级中没有发现合适的拥有子实例的生命周期域,则抛出异常:DependencyResolutionException;

InstancePerHttpRequest:在一次Http请求上下文中,共享一个组件实例。仅适用于asp.net mvc开发。

 

posted @ 2015-11-23 22:06  尋找一個證明  阅读(1605)  评论(0)    收藏  举报