在我的開發團隊,我們正在使用中this article描述的CQRS模式,並使用建議 DI容器:Simple Injector(雙關語意)。簡單的噴油器註冊和執行內部CommandHandler
這是我們目前的項目結構:
- 01的WebApp
references => [02] [03]
- 02合同
- 03 BusinessLayer
項目01是客戶端(一個ASP.NET MVC應用4)在那裏我們通過簡單注射器註冊我們的應用服務(Bootstrapper
)。項目03是所有命令和查詢處理程序的定義,如文章中所述。 Project 02是定義命令和查詢的地方。爲了簡單注入器註冊處理程序,客戶端直接引用業務層組件。
容器註冊commandhandlers這樣
container.Register(typeof(ICommandHandler<>), assemblies);
現在的問題是,是,我們的開發者之一偶然忘記申報其處理程序類中的一個作爲public
。因此,而不是:
他寫道:
class AddCustomerCommandHandler : ICommandHandler<AddCustomerCommand> { ... }
現在根據msdn,如果省略了訪問修飾符,內部使用:
類和結構被直接聲明在名稱空間內( ,也就是說,不嵌套在其他類或結構中)可以是公共的或內部的 。 如果未指定訪問 修飾符,則內部爲默認值。
現在內部被定義爲:
的類型或成員可以通過任何代碼在相同的組件進行訪問, 但不能從另一個組件。
嘗試執行此命令後,運行時不會引發任何錯誤並且該命令可以愉快地執行。我對此感到驚訝,因爲我希望Simple Injector發現驗證錯誤,但它不會。另外,當試圖直接實例化客戶端中的處理程序對象時,編譯器給我一個錯誤,正如預期的那樣it cannot access an internal class here
!那麼爲什麼Simple Injector能夠註冊這個命令處理程序,而訪問修改器是internal
?