天天看點

Autofac - 程式集掃描

通過程式集掃描, 能夠自動注冊符合規則的類型. 這種方式, 很友善. 這一篇就介紹下程式集掃描吧. 

一、掃描

其實前面已經介紹過, 這種方式. 不過并不全.

先看一個之前的方式:

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()方法中, 就注冊了所有符合規則的服務.