IoC容器Autofac正篇之类型注册(五)
Autofac类型注册
类型注册简单的从字面去理解就可以了,不必复杂化,只是注册的手段比较丰富。
(一)类型/泛型注册
builder.RegisterType<Class1>();
这种简单较常用,但缺点是注册的类型必须在当前项目或被当前项目引用,因为使用泛型,必须类型明确。
针对这点,还有一种通过Type对象进行注册的方式:
//字符串为类型完全名称
builder.RegisterType(Type.GetType("AutofacBlog.Class_1"));
使用这种方式进行类型注册,被注册的类型可以不是被直接引用,但类型所在的程序集必须被加载。
这种注册方式在有插件或类似需要动态加载程序集的情况下使用,通过扫描程序集,获取一些满足指定条件的类型,来进行注册。
(二)程序集批量注册
类型注册中提到了通过扫描程序集来获取部分类型进行注册。Autofac对此提供了一个方便的方式,可以直接通过程序集来筛选类型注册:
//获取当前应用程序加载程序集(C/S应用中使用) var assembly = Assembly.GetExecutingAssembly(); var builder = new ContainerBuilder(); builder.RegisterAssemblyTypes(assembly); //注册所有程序集类定义的非静态类型
代码通过RegisterAssemblyTypes方法,将assembly中所有自定义的非静态类型都注册到Autofac中,后面可以使用IContainer对象获取所有该程序集中自定义的类型对象。
这种方式达到了批量的效果,但是通常,我们并不需要把所有的类型都进行注册,所以Autofac提供了几种过滤方式:
builder.RegisterAssemblyTypes(assembly)
.Where(type => type.Namespace.Equals("IocAutofac.Example")); //条件判断
这种方式相信大家都比较熟悉,Where+lambda的方式来进行条件判断,lambda参数为Type类型,也就是程序集中的type。
builder.RegisterAssemblyTypes(assembly)
.Except<Program>(); //排除Program类型
这种方式用来排除指定类型的注册,当排除的个例比较少时,会比较适用。Except还有另一种用法,但是用法比较复杂,在此不进行介绍。
builder.RegisterAssemblyTypes(assembly)
.InNamespace("IocAutofac.Example"); //类型在IocAutofac.Example命名空间中
被注册的类型需要在指定命名空间中。
builder.RegisterAssemblyTypes(assembly)
.InNamespaceOf<Program>(); //类型在Program所在的命名空间中*/
这种方式与上面一种方式比较相似,也是用来判断命名空间的,这种方式是根据类型来获取命名空间。
通过这种方式,我们可以对程序集中的类型进行批量注册,类型/泛型方式在被注册类型较少的情况下还是不错的,但当被注册类型很多的时候,一个一个的手写注册会显得很无力,这时候就是程序集批量注册显威的时候了。
(三)Lambda注册
上面讲到的两种方式都是通过类型进行直接注册的,这种注册方式,在获取时,会直接通过构造函数new出对象,不会做更多的操作。
有时,我们希望能够在获取对象时能够自动的做更多的事情时,我们可以通过Lambda注册来解决:
|
1
2
3
4
5
6
7
8
9
|
builder.Register(cc =>{ var clas1 = new Class_1(); while (clas1.Id.ToString().Contains("a")) { clas1.Id = Guid.NewGuid(); } return clas1;}); |
上述代码,实际注册了Class_1类型,因为最后返回的对象类型为Class_1。
Register方法接收了一个lambda表达式作为参数,在lambda表达式中,我们可以做很多事,包括一些属性注入(后续说明)、方法注入(后续说明)、条件判断等等。
(四)实例注册
var clas1 = new Class_1(); clas1.Id = Guid.Empty; builder.RegisterInstance(clas1);
通过RegisterInstance进行实例注册,进行实例注册时,我们需要注意,实例注册可以作为一种单例注册的方式,也就是在后面通过Autofac获取Class_1对象时,获取到的是注册时的那个对象。并且,如果一个在某处修改了该对象,其他地方再获取时,获取到的就是修改后的对象。
(五)Module注册
在日常开发中,可能不同开发会负责不同的模块进行单独开发。在开发过程中,不同模块可能都有自己的类型需要注册到autofac中,但是如果每个人在注册时,都去修改一个指定地方的代码,这在进行代码合并时,是令人痛苦的。更好的方式是每个开发不同的模块都有自己指定的类型注册区域,这样,在代码合并时,会减少很多代码冲突。
对于这种方式,Autofac已经为我们提供了:


class Program
{
static void Main(string[] args)
{
var builder = new ContainerBuilder();
builder.RegisterModule<ModuleA>();
//这两种注册方式达到的效果都一样
builder.RegisterModule(new ModuleB());
IContainer container = builder.Build();
Class_1 clas1 = container.Resolve<Class_1>();
Class_2 clas2 = container.Resolve<Class_2>();
Console.WriteLine(clas1.Id);
Console.WriteLine(clas2.ToString());
Console.Write("Press any key to continue...");
Console.ReadKey();
}
}
class ModuleA : Module
{
protected override void Load(ContainerBuilder builder)
{
builder.RegisterType<Class_1>();
}
}
class ModuleB : Module
{
protected override void Load(ContainerBuilder builder)
{
builder.RegisterType<Class_2>();
}
}


两个继承自Module类的类:ModuleA、ModuleB重写了父类的Load方法并在load方法中注册了Class_1与Class_2类型,然后在主程序中,通过RegisterModule对Module进行注册。不同的开发就可以各自创建一个类继承自Module,然后重写Load方法,在Load方法进行自己的类型注册,最后再进行Module的统一注册。
Module注意说明
实际上,RegisterModule需要的参数,并不是继承自Module类的,而是实现了IModule接口的类,而Module也是实现了IModule接口的。也就是我们也可以写一个实现了IModule接口的类型,然后在RegisterModule时传入。但是一般我们直接去继承Module就好了,这种方式比较简单方便,实现IModule的方式更为复杂,当然,功能也更多,在此就不进行介绍了。
程序集Module注册
Module注册,为多人开发提供了一种方便的注册方式,但这种方式还是会需要手动注册Module,如果Module过多,Module注册代码也会显得多而杂,当然,可以通过人工管理来控制Module的量。但是Autofac还提供了一种更方便的方式且对于类似Orchard的模块开发(子模块与主模块无引用关系,通过程序集加载方式来加载子模块)或是插件开发,我们没办法通过Registerodule来注册无直接引用关系的Module。
对于上述的情况,Autofac提供了很好的方式来解决:
var builder = new ContainerBuilder(); var assembly = Assembly.GetExecutingAssembly(); builder.RegisterAssemblyModules(assembly);
代码注册assembly程序集中所有实现了IModule接口的类型,这样只需要取出所有程序集通过RegisterAssemblyModules进行一次性注册,就可以自动注册所有Module了。
RegisterAssemblyModule还可以指定一个泛型类型:
builder.RegisterAssemblyModules<ModuleA>(assembly);
这样注册是指定只注册assembly程序集中继承自ModuleA的Module。
文章来源: http://www.cnblogs.com/ancupofcoffee/p/5007649.html
备注:类型注册只是一部分,个人认为一般不会注册一个类型然后直接去取这个类型的实例,因为没有那个必要。autofac常用的应用场景应该是像简单实例篇中所描述的场景,所以有了类型关联这一篇。
IoC容器Autofac正篇之类型注册(五)的更多相关文章
- IoC容器Autofac正篇之类型注册(四)
Autofac类型注册 类型注册简单的从字面去理解就可以了,不必复杂化,只是注册的手段比较丰富. (一)类型/泛型注册 builder.RegisterType<Class1>(); 这种 ...
- IoC容器Autofac正篇之类型关联(服务暴露)(七)
类型关联 类型关联就是将类挂载到接口(一个或多个)上去,以方便外部以统一的方式进行调用(看下例). 一.As关联 我们在进行手动关联时,基本都是使用As进行关联的. class Program { s ...
- IoC容器Autofac正篇之类型关联(服务暴露)(八)
类型关联 类型关联就是将类挂载到接口(一个或多个)上去,以方便外部以统一的方式进行调用(看下例). 一.As关联 我们在进行手动关联时,基本都是使用As进行关联的. 1 2 3 4 5 6 7 8 ...
- IoC容器Autofac正篇之解析获取(五)
解析获取的方式有如下几种: Resolve class Program { static void Main(string[] args) { var builder = new ContainerB ...
- IoC容器Autofac正篇之简单实例
先上一段代码. namespace ConsoleApplication3 { class Program { static void Main(string[] args) { ContainerB ...
- IoC容器Autofac正篇之简单实例(四)
先上一段代码. namespace ConsoleApplication3 { class Program { static void Main(string[] args) { ContainerB ...
- IoC容器Autofac正篇之解析获取(六)
解析获取的方式有如下几种: Resolve class Program { static void Main(string[] args) { var builder = new ContainerB ...
- IoC容器Autofac正篇之依赖注入(六)
依赖注入,这个专业词我们可以分为两个部分来理解: 依赖,也就是UML中描述事物之间关系的依赖关系,依赖关系描述了事物A在某些情况下会使用到事物B,事物B的变化会影响到事物A: 注入,医生通过针头将药物 ...
- IoC容器Autofac正篇之依赖注入(七)
依赖注入,这个专业词我们可以分为两个部分来理解: 依赖,也就是UML中描述事物之间关系的依赖关系,依赖关系描述了事物A在某些情况下会使用到事物B,事物B的变化会影响到事物A: 注入,医生通过针头将药物 ...
随机推荐
- CSS预处理器 Less Sass,Scss 编译 Sourcemap调试
sass.less和stylus的安装使用和入门实践 SASS用法指南 Sass Basics CSS预处理器 css preprocessor 预处理器即preprocessor,预处 ...
- poj 1308Bugs Integrated, Inc. [三进制状压]
题目链接[http://poj.org/problem?id=1038] 题意: 给出一个N*M大小的图,图中有K个坏点.N (1 <= N <= 150), M (1 <= M & ...
- Codecraft-17 and Codeforces Round #391 (Div. 1 + Div. 2, combined)
传送门:http://codeforces.com/contest/757 A题题意是给你一个字符串,让你在里面找到"Bulbasaur"这样的单词有多少个,字符串可以重排列.实际 ...
- logstash 输出到elasticsearch 自动建立index
由于es 单index 所能承受的数据量有限,之前情况是到400w数据300G左右的时候,整个数据的插入会变得特别慢(索引重建)甚至会导致集群之间的通信断开,于是我们采用每天一个index的方法来缓解 ...
- 在Eclipse中安装testNG插件
1. 选择菜单:Help->Install New Software,点击Add按钮输入框中输入相应的Name:testNG和Location:http://beust.com/eclipse. ...
- Json-lib用法
Json-lib用法 1.需要的jar包有一下几个,别的文章中没有xom这个jar包,但我的工程中如果没有这个包,那么,json数据转换为xml数据的程序中在执行XMLSerializer xmlSe ...
- CodeForces 703A Mishka and Game
简单题. #pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #inclu ...
- oracle 索引 。其中全文检索最变态
全文检索 位图索引 B 全文检索很少使用,如果产品上使用 大家可以用Lcunce这些应用如果非要在数据库做这个采用就把用一个全文检索索引 检索索引 不会像其他的索引创建一个对象他会创建十个相关的对象. ...
- 浅谈MacOS-20155205郝博雅
预备作业3:安装虚拟机 我的电脑是MacBook Air,因此按照娄老师说的,不需要安装Linix系统便能完成之后的学习.所以我就浅谈一下用MacOS系统的感受. 优点:人性化&便捷 与同系列 ...
- javascript中关于this的理解
首先看一下这几个定义 this对象是在运行时基于函数的执行环境绑定的:在全局函数中,this等于window,而当函数被视为某个对象的方法调用时,this等于那个对象. 不过,匿名函数的执行环境具有全 ...