2013-03-01 82 views
1

我檢討現有的代碼,並有「豆」類:依賴注入 - 我應該注入「工具類」

[Serializable] 
public class MyData { 
string S {get;set;} 
int I {get;set;} 
//bla bla bla 
private IStringConverter sc; 
public MyData(IStringConverter sc){this.sc=sc} 
} 

我相信這是完全錯誤的注入工具類/不管處理器或在Model類中,有兩個原因: 1)這會阻止序列化 2)爲什麼?模型類不應該有行爲。

你同意嗎? (我應該改變這樣寫的班?)

+0

是'MyData'一個簡單的DTO(數據傳輸對象)? – 2013-03-01 12:34:27

+0

是的,它應該被存儲爲XML,並在會話 – 2013-03-01 12:34:54

+1

我想模型行爲停止是模型 – nilphilus 2013-03-01 12:35:00

回答

3

您可以改爲創建一個新的服務,該服務在DTO實例上運行並且注入了其依賴關係。通過這種方式,您可以從DTO中獲得行爲,並且一切都再次清潔。良好的建築適合。

2

注射服務爲一體的DTO可能不是最好的主意:)

我會使用,是以服務作爲一個參數的擴展方法考慮。

通過這種方式,'行爲'與DTO分開,序列化不成問題。

0

一個擴展方法可能是要走的路,但我認爲這有點像把你的邏輯變成一個編譯時的單例,如果它永遠不會改變,那就好了。

因此,作爲然後所有的一切是基於合同我會嘗試這樣的事情,並注射

public class Poco 
{ 
    public int Foo; 
    public int Bar; 
} 

public class PocoUtility : IPocoUtility 
{ 
    private IService _service; 
    public PocoUtility(IService service) 
    { 
     _service = service; 
    } 

    public Result DoSomethingWithPoco(Poco poco) 
    { 
     return _service.Convert(poco); 
    } 
} 

public class SomethingThatUsesAPoco 
{ 
    private IPocoUtility _logicForSomething; 

    public SomethingThatUsesAPoco(IPocoFactory pocoFactory, IPocoUtility logicForSomething) 
    { 
     _poco = pocoFactory.CreateInstance(); 
    } 

    public Result DoIt() 
    { 
     return _logicForSomething.DoSomethingWithPoco(_poco); 
    } 
}