AutoFac注册2-程序集

程序集扫描
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<MyUnwantedType>();

Except() 表达式同样允许你自定义被排除类型的注册规则:

builder.RegisterAssemblyTypes(asm)
.Except<MyCustomisedType>(ct =>
ct.As<ISpecial>().SingleInstance());

也可以使用多个过滤条件, 他们将会以AND逻辑连接.

builder.RegisterAssemblyTypes(asm)
.PublicOnly()
.Where(t => t.Name.EndsWith("Repository"))
.Except<MyUnwantedRepository>();

指定服务

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<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();

// Registers both modules
builder.RegisterAssemblyModules(assembly);
原文地址:https://www.cnblogs.com/fanfan-90/p/12099281.html