Autofac - 程序集扫描

时间:2024-04-18 16:35:13

通过程序集扫描, 能够自动注册符合规则的类型. 这种方式, 很方便. 这一篇就介绍下程序集扫描吧.

一、扫描

其实前面已经介绍过, 这种方式. 不过并不全.

先看一个之前的方式:

var builder = new ContainerBuilder();

builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly());//.Where(n => n.Name.EndsWith("son"));

var container = builder.Build();

var person = container.Resolve<Person>();
person.Self(); var dog = container.Resolve<Dog>();
dog.Say();

Autofac - 程序集扫描

二、过滤

如果我并不想注册那么多的类型, 但是又想通过程序集的注册方式去注册, 那怎么办呢?

1. Where过滤

builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()).Where(n => n.Name.EndsWith("son"));

var container = builder.Build();

var person = container.Resolve<Person>();
person.Self();

Autofac - 程序集扫描

只需要在后面添加Where方法去过滤即可. 在过滤之后, var dog = container.Resolve<Dog>()这句话就回报错, 因为他并没有注册进去.

2. Except过滤

builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()).Except<Person>();

var container = builder.Build();
//报错
//var person = container.Resolve<Person>();
//person.Self(); var dog = container.Resolve<Dog>();
dog.Say();

Autofac - 程序集扫描

使用Except的时候, 有一个注意的小事项.

builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()).Except<Person>(c => c.As<IPerson>());
var container = builder.Build(); var person = container.Resolve<IPerson>();
person.Self();
//报错
//var personA = container.Resolve<Person>();
//personA.Self();

Autofac - 程序集扫描

从上面可以看到, 虽然Person不能直接用了, 但是却可以通过IPerson的方式, 来获取Person的实例.

三、指定服务

注册的时候, 有一个As方法, 在之前已经看到过了, 就是没有解释过. 其实就是指定服务. 不过在程序集扫描里面, 就不是As()了

builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()).AsImplementedInterfaces();
var container = builder.Build(); var person = container.Resolve<IPerson>();
person.Self();

Autofac - 程序集扫描

额, 这里居然调用了两个构造函数, 别在意, 我用的是上一篇的代码.

在AsImplementedInterfaces()方法中, 就注册了所有符合规则的服务.