程序集扫描
Autofac可以在程序集中通过约定找到和注册组件. 你可以扫描和注册单独的类型, 也可以专门扫描 Autofac模块.
扫描类型
var dataAccess = Assembly.GetExecutingAssembly(); builder.RegisterAssemblyTypes(dataAccess) .Where(t => t.Name.EndsWith("Repository")) .AsImplementedInterfaces();
每次 RegisterAssemblyTypes() 方法调用将应用一组规则 - 如果有多组不同的组件注册时, 我们有必要多次调用 RegisterAssemblyTypes() .
过滤类型
RegisterAssemblyTypes() 接收包含一个或多个程序集的数组作为参数. 默认地, 程序中所有具体的类都将被注册. 包括嵌套的私有类. 你可以使用LINQ表达式过滤注册的类型集合.
过滤公共类型:
builder.RegisterAssemblyTypes(asm)
.PublicOnly();
要过滤注册的类型, 使用 Where() 表达式:
builder.RegisterAssemblyTypes(asm) .Where(t => t.Name.EndsWith("Repository"));
要从扫描类型中排除类型, 使用 Except() 表达式:
builder.RegisterAssemblyTypes(asm) .Except();
Except() 表达式同样允许你自定义被排除类型的注册规则:
builder.RegisterAssemblyTypes(asm) .Except(ct => ct.As ().SingleInstance());
也可以使用多个过滤条件, 他们将会以AND逻辑连接.
builder.RegisterAssemblyTypes(asm) .PublicOnly() .Where(t => t.Name.EndsWith("Repository")) .Except();
指定服务
As() 和 Named() 方法还有接收lambda表达式的重载, 表达式决定了对于一个类型而言, 它提供了哪些服务:
builder.RegisterAssemblyTypes(asm) .As(t => t.GetInterfaces()[0]);
组件分配给泛型服务:
builder.RegisterAssemblyTypes(asm) .AsClosedTypesOf(typeof(IRepository<>));
扫描模块
我们通过 RegisterAssemblyModules() 方法进行模块扫描, 它通过提供的程序集扫描 Autofac模块, 然后使用当前的container builder来注册它们.
例如, 假设下面两个普通的模块类在同一个程序集中, 并且每个模块注册一个组件:
public class AModule : Module { protected override void Load(ContainerBuilder builder) { builder.Register(c => new AComponent()).As(); } } public class BModule : Module { protected override void Load(ContainerBuilder builder) { builder.Register(c => new BComponent()).As (); } }
RegisterAssemblyModules() 的重载 不接受类型参数 , 它将会注册所提供程序集列表中的所有实现 IModule 的类. 在下面的示例中 所有的模块 都将被注册:
var assembly = typeof(AComponent).Assembly; var builder = new ContainerBuilder(); // Registers both modules builder.RegisterAssemblyModules(assembly);