3

我使用.NET 4.5,Ninject 3 the binding by convention lib如下:Ninject綁定通過公約沒有泛型類型的工作

kernel.Bind(x => x 
    .FromAssembliesMatching("assembly.dll") 
    .SelectAllClasses().InheritedFrom(typeof(ICommandHandler<>)) 
    .BindAllInterfaces()); 

,這是正確的約束力的:

public class MyCommandHandler : ICommandHandler<MyCommand> 

沒有按't bind:

public class MyGenericCommandHandler<T> : ICommandHandler<MyGenericCommand<T>> 

但是,pre vious結合的作品,如果我想補充的具體實施我的泛型類的單個綁定,如:

kernel.Bind(typeof(ICommandHandler<MyGenericCommand<float>>)) 
     .To(typeof(MyGenericCommandHandler<float>)) 
kernel.Bind(typeof(ICommandHandler<MyGenericCommand<int>>)) 
     .To(typeof(MyGenericCommandHandler<int>)) 

但是,增加每一個人泛型類型違背公約的目的,需要對每個可能的個別類型如float添加綁定,整型,字符串,等等

你知道如何修改公約或添加(配有一個完全不同的解決方案,甚至 )另外一個支持通用 版本我的命令嗎?即支持兩級仿製藥。

+0

這聽起來不像是你做錯了什麼或瘋狂的事情,丁丁我不清楚你想要什麼。一個開放的泛型類不能被實例化,但是你可以做[像這樣的東西](http://stackoverflow.com/questions/11682495/ninject-and-binding-generics)。你能澄清一下'TParameter'是什麼,你是如何指定你想要的'Type'的,並且放入更多的例外是沒有害處的。 –

+0

@RubenBartelink我的確改善了這個問題,並給出了一個更具體的例子。我希望這回答了你的問題。 – Adam

+1

你有沒有從[並因此實現] ICommandHandler >這個消息說你不?它是公開的嗎?是必需的類型的開放通用?通常人們有一個開放的通用級別 - ICommandHandler <>'然後有一個實現類的具體類。不幸的是我現在更困惑,但希望別人能看到你想要做什麼 –

回答

0

編輯:不編譯[和事實它沒有揭示的要求沒有意義],請參閱評論中的結論推理。


這只是普通的開放式泛型情況。正如我在前面的評論的鏈接提到,順便基本結合使該DRY看起來很簡單:

kernel.Bind(typeof(ICommandHandler<MyGenericCommand<>>)) 
    .To(typeof(MyGenericCommandHandler<>)); 

此綁定,然後將足以滿足任何T變種ICommandHandler<MyGenericCommand<T>>

在做基於約定的約束條件下映射你所期望的內容時,問題在於SelectAllClasses().InheritedFrom(typeof(ICommandHandler<>))不包含泛型類 - 這很有意義,因爲很少可以指定非具體類的泛化規則。

您可以

  • 使用DSL的一個不同的投影部來選擇通用類,然後在一些約定基於方式結合它們
  • 暴露從組件一個NinjectModule暴露[開]通用服務,其執行上述Bind,然後執行模塊[通過DLL名稱模式的概率]的kernel.Load()
+0

您提到的前兩個代碼行不會編譯錯誤消息'預期類型'這就是爲什麼我不得不在我的例子中提供'float'和'int'的原因。 – Adam

+0

@Adam正確的說,開放的通用語法(和.NET類型系統)沒有辦法表達一個* nested *類型arg open的類型。您需要通過回到僅具有開放參數的頂級類來解決此問題。這裏的底線是你有一個Jon Skeet C#標籤問題,而不是Ninject問題。更重要的是,你偏離了路徑 - 你的代碼試圖告訴你一些東西......兩個通用性軸很少是一個好主意(有點像MI ...) –

+0

謝謝,但我不會說'偏離路徑',因爲這是一個具有通用命令的標準CQRS模式實現。不過,我同意你的觀點,即具有兩個通用級別是C#限制,C++模板具有此功能,所以它實際上是C#限制,而不是我的實現。 – Adam