2015-07-19 34 views
0

我正在尋找如何使用Ninject來獲取從也傳遞一些自定義布爾條件的基類繼承的所有實例。這是previous question的延續。這就是我爲從MyAbstractClass繼承的所有類創建一個賓果。Ninject:構造從抽象類繼承的所有類,它也傳遞一些自定義布爾邏輯

_kernel.Bind(x => { x 
    .FromThisAssembly() 
    .SelectAllClasses() 
    .InheritedFrom<MyAbstractClass>() 
    .BindAllBaseClasses() 
    .Configure(syntax => syntax.InSingletonScope()); 
}); 

如果我有正確的語法,這將爲從MyAbstractClass繼承的所有類創建一個單例作用域綁定。接下來,我需要獲取/構建所有類。

IEnumerable<MyAbstractClass> items = kernel.GetAll<MyAbstractClass>(); 

上面的代碼將獲取/創建從MyAbstractClass繼承的所有類。

現在我需要在此過程中再添加一個步驟。基於「訪問角色」,不應該創建從MyAbstractClass繼承的所有類,因爲當前用戶可能無法訪問每個派生類的功能。所以我試着給每個派生類添加一個CanLoad布爾值並嘗試以下操作。

IEnumerable<MyAbstractClass> items = kernel.GetAll<MyAbstractClass>().Where(x => x.CanLoad == true); 

雖然項目沒有隻包含我期望的類,根據我CanLoad邏輯,我沒有看到每一個派生類的構造函數被調用,因爲kernel.GetAll()方法。它也將不得不創建類來調用它的CanLoad方法,所以這將不起作用。我想過讓CanLoad也是靜態的。我也想到了一種類似於以下的方法。

public bool CanLoad<T>() where T : MyAbstractClass { 
    //return true if the current user has the correct access roles to create class of type T 
} 

所以我的問題是我如何使用Ninject GETALL()方法來獲取從MyAbstractClass也爲CanLoad布爾方法返回true繼承的所有類?我一直在嘗試使用Ninject和Linq,可能還有Reflection,但我還沒有解決方案。

編輯:

要解釋一下「權限的邏輯」,在開始的時候我們的應用程序調用了一個網絡服務來獲取LDAP組/角色被返回的簡單列表列表串。每個派生類實際上都是ViewModel,並且每個ViewModel「需要」其功能的最小角色才能被當前用戶使用。我認爲我可以將Ninject/binding/get邏輯與一些自定義的「權限邏輯」綁定,並且只綁定當前用戶可以訪問的類。虛擬機列表成爲停靠控件的一個ItemsSource綁定(我們正在考慮爲Ribbon控件也創建一個ItemsSource綁定)。這一切都是研究。

回答

1

添加When約束的結合:

.Configure(syntax => syntax 
    .When(... check permission here...) 
    .InSingletonScope()); 

既然你沒有說你怎麼知道用戶是否有權限的邏輯東西,我不能在這裏給你更具體的信息。但是一般來說,只要你想確保它不能和不會被實例化,除非滿足一個條件,你應該爲綁定添加一個'When'約束。

+0

感謝您的回覆。我能夠基於簡單的測試獲得When語法。 Ninject沒有爲從MyAbstractClass繼承的特定類創建綁定,但如果直接調用Get ()方法,則這些類仍可由Ninject創建。這就是爲什麼我最初在尋找GetAll ()和Get ()方法。 – Eric

+0

@Eric這是因爲你使用'.BindAllBaseClasses()'。類本身不是基類。爲了完全綁定'MyAbstractClass'和具體類型,你可以實現'IBindingGenerator'並使用'BindWith <>',或者你可以使用'BindSelection(ServiceSelector)',其中'ServiceSelector'委託返回變量'type'和'typeof (MyAbstractClass)'。然後,如果您禁用ninject也會創建沒有綁定的具體類的選項,它也可以工作。 – BatteryBackupUnit