2010-01-26 66 views
9

我使用JSON.NET爲不同目的序列化和反序列化對象。我是DI的忠實粉絲,但下面的代碼給了我寒戰。氣味是不好的代碼:DI和JSON.NET

public class Foo : Baz 
{ 
    private readonly IBar bar; 

    public Foo() 
     : this(ObjectFactory.GetInstance<IBar>()) 
    { } 

    public Foo(IBar bar) 
    { 
     if (bar == null) 
      throw new ArgumentNullException("bar"); 

     this.bar = bar; 
    } 

    ... rest of class ... 
} 

默認的構造函數是讓我寒戰的東西。我已經添加了此支持造成JSON.NET反序列化:

string jsonString = ...; 
string concreteBazType = ...; 

Baz baz = (Baz)JsonConvert.DeserializeObject(jsonString, Type.GetType(concreteBazType); 

通知之類Foo inherrits從抽象基類巴茲!

我的問題,你所有的DI和JSON.NET怪傑在那裏:我如何改變代碼,以避免代碼嗅覺默認構造函數給我在類Foo?

回答

18

這是各種Data Transfer Objects的常見問題,無論它們是否適合JSON.NET,WCF或其他技術。實際上,你可以說所有的應用程序邊界都面臨着這個問題,或者是某種程度上的問題。該問題對於Windows窗體控件和其他顯示技術是等效的。

在應用程序堆棧的另一端,我們看到與Configuration對象相同的問題,並且可能帶有一些ORM類型(如實體框架類)。

在所有情況下,最好的方法是將所有這樣的邊界對象視爲具有比行爲更多結構的啞類型。我們已經知道這對於WCF DataContracts,ASP.NET MVC Views,Windows Forms Controls等來說是正確的,所以這將是一個衆所周知的解決方案。

就像我們有控制器在UI中填充視圖一樣,我們可以擁有服務操作,映射器以及將DTO映射到域對象的東西。換句話說,你最好的辦法是不要嘗試序列化Foo。

取而代之,定義一個代表Foo靜態結構的類FooJson,並使用映射器在兩者之​​間進行轉換。