2

我可能在这里遗漏了一些明显的东西......

但是当我学会欣赏 IoC 和 ctor 注入的荣耀时,我很难将其与对象图序列化相协调。这两种模式兼容吗?为什么或者为什么不)?

假设有:

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;
    }
}

我喜欢通过 ctor 注入保护类不变量的铁皮安全。它让我的对象确信他们将永远拥有他们需要的东西。注入不变量是否与存储库模式不一致?也许在某个地方有一个 DTO 层和一个工厂模式可以弥合差距......?

寻找明智的建议...这两种模式兼容吗?为什么或者为什么不)?

PS:我知道 IDeserializationCallback 但我看不出它对“私有只读”不变量有何帮助

4

2 回答 2

5

Mark Seemann 有一篇关于该主题的文章,At the Boundaries, Applications are Not Object-Oriented。底线是:在边界应用程序不是面向对象的。如果发生某种翻译(如序列化),则无法保护您的类不变量。

于 2012-01-22T05:05:06.187 回答
0

我不清楚您的问题与存储库模式有什么关系。你需要序列化你的存储库吗?

在任何情况下,使用 XML 序列化都具有必须在属性上设置设置器的限制。和你一样,我更喜欢为构造函数保留类不变量,所以我也觉得这很痛苦。这只是在 .Net 中使用 XML 序列化的现实,因此您别无选择(我认为您可以编写自定义序列化程序,但这是一个痛苦的 IIRC)。

如果您有选择,您可能会考虑切换到二进制序列化,它可以序列化私有成员变量。我能找到的最佳来源在这里

编辑:我想更直接地回答你的问题:模式本身并不矛盾,但技术实现(使用 XML 序列化时)使它们不兼容。

于 2012-01-22T03:13:07.693 回答