通過程式集掃描, 能夠自動注冊符合規則的類型. 這種方式, 很友善. 這一篇就介紹下程式集掃描吧.
一、掃描
其實前面已經介紹過, 這種方式. 不過并不全.
先看一個之前的方式:
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();
二、過濾
如果我并不想注冊那麼多的類型, 但是又想通過程式集的注冊方式去注冊, 那怎麼辦呢?
1. Where過濾
builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()).Where(n => n.Name.EndsWith("son"));
var container = builder.Build();
var person = container.Resolve<Person>();
person.Self();
隻需要在後面添加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();
使用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();
從上面可以看到, 雖然Person不能直接用了, 但是卻可以通過IPerson的方式, 來擷取Person的執行個體.
三、指定服務
注冊的時候, 有一個As方法, 在之前已經看到過了, 就是沒有解釋過. 其實就是指定服務. 不過在程式集掃描裡面, 就不是As()了
builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()).AsImplementedInterfaces();
var container = builder.Build();
var person = container.Resolve<IPerson>();
person.Self();
額, 這裡居然調用了兩個構造函數, 别在意, 我用的是上一篇的代碼.
在AsImplementedInterfaces()方法中, 就注冊了所有符合規則的服務.