1

this例如:開放泛型和反模式的DI綁定?

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

這是有效的NInject和我的問題是,這是否是一種濫用/反模式。

問題是你不能擁有一個類型爲IRepository <>的成員/參數變量,因此擁有這個綁定實例的唯一方法是通過一個帶有Type請求的工廠。即

_kernel.Get(typeof(IRepository<>)); 

探索的一個可能的途徑可能是使用動力學;

public Foo(IRepository<dynamic> repository) 
{} 

至少在這裏我們有一個注入的構造函數參數,它遵守控制反轉。

我在問以上是因爲another question我問過開放式的泛型;在這方面下面...

public Foo(IEnumerable<IRepository<dynamic>> allRepoInstancesInjected) 

...似乎應該是可能的東西。

回答

3

我想你想知道如何打開通用綁定工作。

您無法使用_kernel.Get(typeof(IRepository<>));解決開放式泛型這隻會引發異常。您無法獲得所有可能的封閉泛型的枚舉。或者你期望IEnumerable<IList<T>>期望返回什麼?一個枚舉IList結合所有曾經和將要在地球上實現的類?

您可以使用它們來獲得精心指定的封閉泛型。例如。而不是定義應用程序中使用類似全封閉的仿製藥:

Bind(typeof(IRepository<Foo>)).To(typeof(Repository<Foo>)); 
Bind(typeof(IRepository<Bar>)).To(typeof(Repository<Bar>)); 
Bind(typeof(IRepository<Baz>)).To(typeof(Repository<Baz>)); 

你只需定義它一次

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

然後你就可以讓他們爲封閉式泛型依賴

ctor(IRepository<Foo> fooRepository) 

我不沒有看到任何反義模式。如果通用存儲庫是反模式是另一個問題,但不是這個問題的一部分。

和獲取開放式泛型的動態確實工作

ctor(IRepository<dynamic> dynamicRepository)