2015-04-01 178 views
0

它比泛型更像泛型,但我很好奇。如何使用泛型類型參數調用泛型方法

以下正在正常工作

kernel.Bind(typeof(IEntityRepository<,>)).To(typeof(LoggerRepository<,>)); 

但是,如果我想使用泛型?以下給我編譯時間錯誤

kernel.Bind<IEntityRepository<,>>().To<LoggerRepository<IEntity<>,int>(); 

kernel.Bind<IEntityRepository<,>>().To<LoggerRepository<,>(); 

我相信我失去了一些東西很簡單,而且肯定有我的回答是ST的一些地方。有人可以請我指出答案嗎?

編輯:以下正常工作

kernel.Bind<IEntityRepository<AppUser, int>>().To<EntityRepository<AppUser, int>>(); 

但我想應該有一種方法,而不指定類型(AppUse和int)。

回答

1

如果未指定泛型的所有類型參數,則不能在typeof()以外的任何表達式中使用它們。這篇文章能爲您有所幫助:Unbound Generics: an Open and Closed Case

我指的是這部分特別,它討論結合使用未綁定的泛型與依賴注入:

當您使用代碼來執行註冊,你也省略了類型參數;例如RegisterType(typeof(MyTypes.IMyInterface <,>))。正如前面看到的,微軟表示,「typeof運算符可以在綁定的泛型類型進行操作(即還沒有具體的類型參數泛型類型)」

編輯:

一般來說,使用未綁定泛型與依賴注入將導致混淆和難以閱讀的代碼。如果我沒有弄錯,你正在試圖這樣做,因爲你可以將這些限制放在類型參數上。

但是,爲什麼不只是爲你使用的類型定義一個父接口呢?當然,你會失去約束,但是在這樣的情況下他們真的需要嗎?您已經在控制一個位置的綁定,這是您的DI容器。當通用類型通過其他人將使用的API公開時,主要使用約束。通常,代碼不會通過客戶端的DI容器連線,因爲他們將使用派生類,工廠或直接實例化它。

你有什麼特別的理由想要這樣做嗎?

編輯#2:

也許你正在尋找呢?

kernel.Bind(typeof(IRepository<>)).To(typeof(Repository<>)); 

然後,當你有IRepository<SomeEntity>在調用代碼構造函數的參數,ninject會爲您解決問題爲Repository<SomeEntity>在運行時。

+0

嗨弗雷德,謝謝你的文章,它幫助了我。我想我幾年前就知道這種無約束泛型的概念,但現在它已經從我的腦海中消失了。和我說的kernel.Bind(typeof(IEntityRepository <,>))。(typeof(LoggerRepository <,>));工作得很好。所以我會去用它。 – VivekDev 2015-04-02 06:00:01