通過程式集掃描, 能夠自動註冊符合規則的類型. 這種方式, 很方便. 這一篇就介紹下程式集掃描吧. 一、掃描 其實前面已經介紹過, 這種方式. 不過並不全. 先看一個之前的方式: 二、過濾 如果我並不想註冊那麼多的類型, 但是又想通過程式集的註冊方式去註冊, 那怎麼辦呢? 1. Where過濾 只需 ...
通過程式集掃描, 能夠自動註冊符合規則的類型. 這種方式, 很方便. 這一篇就介紹下程式集掃描吧.
一、掃描
其實前面已經介紹過, 這種方式. 不過並不全.
先看一個之前的方式:
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()方法中, 就註冊了所有符合規則的服務.