Autofac官方文档(六)【注册组件之程序集扫描】
2017-12-07 22:46
232 查看
Autofac可以使用约定来查找和注册程序集中的组件。 您可以扫描并注册各种类型,也可以专门扫描Autofac模块。
扫描类型
否则称为惯例驱动的注册或扫描,Autofac可以根据用户指定的规则从程序集中注册一组类型:var dataAccess = Assembly.GetExecutingAssembly(); builder.RegisterAssemblyTypes(dataAccess) .Where(t => t.Name.EndsWith("Repository")) .AsImplementedInterfaces();
每个
RegisterAssemblyTypes()调用将仅应用一组规则 - 如果要注册多个不同组的组件,则需要多次调用
RegisterAssemblyTypes()。
过滤类型
RegisterAssemblyTypes()接受一个或多个程序集的参数数组。 默认情况下,程序集中的所有公共具体类都将被注册。 您可以使用一些提供的LINQ样式谓词来过滤要注册的类型集。
要筛选已注册的类型,请使用
Where()谓词:
builder.RegisterAssemblyTypes(asm) .Where(t => t.Name.EndsWith("Repository"));
要从扫描中排除类型,请使用
Except()谓词:
builder.RegisterAssemblyTypes(asm) .Except<MyUnwantedType>();
Except()谓词还允许您为特定的排除类型自定义注册:
builder.RegisterAssemblyTypes(asm) .Except<MyCustomisedType>(ct => ct.As<ISpecial>().SingleInstance());
可以使用多个过滤器,在这种情况下,它们将被应用逻辑AND。
指定服务
RegisterAssemblyTypes()的注册语法是单一类型的注册语法的超集,所以像
As()这样的方法也可以使用程序集:
builder.RegisterAssemblyTypes(asm) .Where(t => t.Name.EndsWith("Repository")) .As<IRepository>();
As()和
Named()的可选重载接受lambda表达式,这些表达式决定了一个类型,它将提供哪些服务:
builder.RegisterAssemblyTypes(asm) .As(t => t.GetInterfaces()[0]);
与正常的组件注册一样,多个对
As()的调用被加在一起。
增加了一些额外的注册方法,以便更容易地建立通用约定:
Method | Description | Example |
---|---|---|
AsImplementedInterfaces() | 将类型注册为将其所有公共接口提供为服务(不包括IDisposable) | builder.RegisterAssemblyTypes(asm).Where(t => t.Name.EndsWith(“Repository”)).AsImplementedInterfaces(); |
AsClosedTypesOf(open) | 注册可分配给已打开泛型类型的已关闭实例的类型。. | builder.RegisterAssemblyTypes(asm).AsClosedTypesOf(typeof(IRepository<>)); |
AsSelf() | 默认值:注册类型为自己的 - 当用另一个服务规范覆盖默认值时也很有用. | builder.RegisterAssemblyTypes(asm).AsImplementedInterfaces().AsSelf(); |
扫描模块
模块扫描是通过RegisterAssemblyModules()注册方法来完成的,而注册方法正是其名字所暗示的。 它扫描所提供的Autofac模块的程序集,创建模块的实例,然后将其注册到当前的容器生成器。
例如,假设下面的两个简单模块类存在同一个程序集中,并且每个注册一个组件:
public class AModule : Module { protected override void Load(ContainerBuilder builder) { builder.Register(c => new AComponent()).As<AComponent>(); } } public class BModule : Module { protected override void Load(ContainerBuilder builder) { builder.Register(c => new BComponent()).As<BComponent>(); } }
不接受类型参数的
RegisterAssemblyModules()的重载将注册在提供的程序集列表中找到的实现
IModule的所有类。 在下面的例子中,两个模块都被注册了:
var assembly = typeof(AComponent).Assembly; var builder = new ContainerBuilder(); //注册这两个模块 builder.RegisterAssemblyModules(assembly);
RegisterAssemblyModules()与泛型类型参数的重载允许您指定(模块必须从中派生的)基本类型。 在下面的例子中,只有一个模块被注册,因为扫描受到限制:
var assembly = typeof(AComponent).Assembly; var builder = new ContainerBuilder(); //注册模块但不包含BModule builder.RegisterAssemblyModules<AModule>(assembly);
使用Type对象参数的
RegisterAssemblyModules()的重载与通用类型参数重载类似,但允许您指定可能在运行时确定的类型。 在下面的例子中,只有一个模块被注册,因为扫描受到限制:
var assembly = typeof(AComponent).Assembly; var builder = new ContainerBuilder(); // 注册模块但不包含BModule builder.RegisterAssemblyModules(typeof(AModule), assembly);
IIS托管的Web应用程序
在IIS应用程序中使用程序集扫描时,根据程序集位置的不同,可能会遇到一些麻烦。 (这是我们的常见问题之一)在IIS中托管应用程序时,应用程序首次启动时,所有程序集都加载到
AppDomain中,但当
AppDomain被IIS回收时,程序集仅在需要时加载。
为避免此问题,请使用
System.Web.Compilation.BuildManager上的
GetReferencedAssemblies()方法来获取引用程序集的列表:
var assemblies = BuildManager.GetReferencedAssemblies().Cast<Assembly>();
这将强制引用的程序集立即加载到AppDomain中,使其可用于模块扫描.
相关文章推荐
- Autofac官方文档(五)【注册组件之属性和方法注入】
- Autofac官方文档(四)【注册组件之将参数传递给注册者】
- Autofac中文文档--一、注册组件--4组件扫描
- Autofac官方文档翻译——(二)组件注册(未完)
- Autofac官方文档(三)【注册组件之注册概念】
- Autofac中文文档--一、注册组件--2传递注册参数
- 微信小程序--官方文档补充【操作反馈】--action-sheet组件
- 微信小程序--官方文档补充【操作反馈】--toast组件
- 微信小程序--官方文档补充【操作反馈】--loading组件
- Autofac中文文档--一、注册组件--1注册概念
- Ioc容器Autofac系列(3)-- 三种注册组件的方式
- 003、微信小程序---自定义组件的注册、使用
- 小程序开发指南,官方文档解读【收藏】
- document-scanner 一个基于 OpenCV 的文档扫描程序(从现在开始直到完成)
- Autofac官方文档(十七)【配置】
- Autofac官方文档(二十)【应用集成】
- 上传组件SWFUpload 2.5.0版 官方说明文档 中文翻译版
- Tornado官方文档(三)【协同程序(Coroutines)】
- Ioc容器Autofac系列(3)-- 三种注册组件的方式
- 小程序 学习。。。[个人感觉吧 官方文档写的相当详细了。。]