文章出處

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

一、掃描

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

先看一個之前的方式:

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

 


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


全站熱搜
創作者介紹
創作者 大師兄 的頭像
大師兄

IT工程師數位筆記本

大師兄 發表在 痞客邦 留言(0) 人氣()