2

我可能失去了一些東西很明顯這裏...系列化VS構造函數注入和保護不變

但是,當我學會欣賞IOC的榮耀和構造函數注入我有麻煩的對象圖形序列調和這一點。這兩種模式是兼容的嗎?爲什麼或者爲什麼不)?

假設有:

public class Foo 
{ 
    #region invariants 
    private readonly List<IBar> _bars; 
    private readonly Guid _id; 
    #endregion 

    public Foo(List<IBar> bars, Guid id) 
    { 
     _bars = bars.CannotBeNull("bars"); 
     _id = id.CannotBeNull("id"); 
    } 

    public List<IBar> Bars { get { return _bars; } } 

    //some other state I want serialized 
} 

public static class Ex 
{ 
    public static T CannotBeNull<T>(this T obj, string paramName = "") 
    { 
     if (null == obj) throw new ArgumentNullException(paramName); 
     return obj; 
    } 
} 

我想通過構造函數注入保護類不變的鐵包saftey。它給我的對象一定的東西,他們將永遠擁有他們需要的東西。注入與存儲庫模式不一致的不變量?也許有一個DTO層和一個工廠模式在某處填補了空白......?

尋找聰明的建議......兩種模式是否兼容?爲什麼或者爲什麼不)?

PS:我知道IDeserializationCallback但我看不出它如何與「私人只讀」不變有助於

回答

0

我不是什麼你的問題與存儲庫模式做明確。你需要序列化你的倉庫嗎?

在任何情況下,使用XML序列化都必須在屬性上設置setter。和你一樣,我更喜歡讓構造函數保持類不變,所以我也覺得這很痛苦。這只是在.Net中使用XML序列化的一個現實,所以你沒有選擇(我認爲你可以編寫自定義序列化器,但這是一個令人費解的IIRC)。

如果你有選擇,你可以看看切換到二進制序列化,它可以序列化私有成員變量。我能找到的最佳來源是here

編輯:我想直接回答你的問題:模式本身並不矛盾,但技術實現(使用XML序列化時)使它們不兼容。

+0

我可能會對回購模式感到困惑,我認爲某些有助於回購的API需要公共設置者...... – dFlat