2010-06-17 354 views
5

我想開始使用C#的一些簡單的依賴注入,我碰到一個問題,我似乎無法拿出答案。C#依賴注入 - 如何注入無源的依賴關係?

我有一門課是由另一個部門編寫的,我沒有在我的項目中有源代碼。我想通過一個使用接口的構造函數來注入這種類型的對象,但是當然,我不能改變注入對象的實現來實現接口來在將對象強制轉換爲接口類型時實現多態。

我見過的這個技術的每一個學術例子都有類使用在項目中聲明的類。如果沒有源代碼在項目中可用,我將如何去注入我的依賴項?

我希望有道理,謝謝。

回答

0

如果您不需要更改課程中的任何內容,則幾乎不需要代碼。讓我們假設你在一個DLL中有一個類X,你希望將它注入到你正在編寫的另一個類Y中。在這種情況下,你可以創建X的實例,並把作爲參數Y.這樣的構造會是這個樣子:

添加到含X類項目中的DLL的引用。

Use NameSpaceOfX; 
Class Y 
{ 
    Public Y() //Default constructor 
    { 
    } 

    Public Y(X instanceOfX) 
    { 
     //Use instanceOfX here as required 
    } 
} 

在你的主代碼:

//Create instance of X 
X instanceOfX = new X(); 
//Inject it into Y 
Y instanceOfY = new Y(instanceOfX); 
//Use Y now. 
6

你可以創建一個在你的目標類型的包裝,因此,例如,你可以有一類,他們提供:

public class TheirClass 
{ 
    public void DoSomething(); 
} 

與哪些你可以定義一個接口:

public interface ITheirClass 
{ 
    void DoSomething(); 
} 

和實施一個包裝類,接口:

public class TheirClassWrapper : TheirClass, ITheirClass 
{ 

} 

或者,如果他們提供的類是密封的,你需要做的略有不同:

public class TheirClassWrapper : ITheirClass 
{ 
    private TheirClass instance = new TheirClass(); 

    public void DoSomething() 
    { 
    instance.DoSomething(); 
    } 
} 

然後你可以注入該接口來代替。

我知道在MEF我們可以出口的具體類型,讓他們正確地注射,但我不知道其他IoC容器。

+0

這正是我在想什麼。 – Steven 2010-06-17 07:37:12

+0

適配器模式。好決定。 – Wix 2010-10-18 12:55:19

1

問題是,你爲什麼要注入它作爲一個接口?是因爲類實現了一些你想要抽象出來的屬性/方法,所以它可以被替代,或者你只是試圖「強制」一個標記接口,因爲「我們總是依賴於接口,而不是具體的類」 ?如果是後者,那麼你就走錯了路,因爲無論如何你都可能立即將它投射到混凝土中。

假設前兩個我可以看到兩個選項:

  1. 使用繼承來代替。這可能或不可能取決於已創建的類,但是您可以繼承它並用新類替換舊類。
  2. 您自己創建接口,使用您需要的方法/屬性,並將外部具體類包裝在實現接口的類中。

對於第二種情況,如果你不能繼承,作爲一個例子,假設你只關心一個方法的類(我們稱之爲方法1())創建一個匹配的接口它:

public interface IMyNewInterface 
{ 
    void Method1(); 
} 

然後創建它的實現,需要具體類的依賴關係(由您作爲普通的容器注入)只是調用具體類:

public class MyNewClass : IMyNewInterface 
{ 
    private MyConcreteClass _MyConcreteClass; 

    public void MyNewClass(MyConcreteClass concreteClass) 
    { 
     _MyConcreteClass = concreteClass; 
    } 

    public void Method1() 
    { 
     _MyConcreteClass.Method1(); 
    } 
} 
+0

但是對於這兩個選項中的後者,可以單元測試你自己的類,它使用第三方類作爲傳遞給構造函數的參數。即有可能用ITheirClass嘲笑他們的類別 – 2010-06-17 07:49:54

+0

這兩個選項都可以讓你替換他們的類別(泛型除外),但接口方法將是我的偏好。 – 2010-06-17 08:23:06

+0

對不起,我不是指選項1和2.是指「..我總是依賴...」的報價。也許我誤讀了。也許你的意思是說它不應該只是爲了完成而完成的。但好的做法意味着我們爲未來的變化或維護鋪平道路。如果課堂被注入,那麼它會使注入更容易,例如aop性能測量。 – 2010-06-17 08:38:14