Architecture 序列化vs ctor注入和保护不变量

Architecture 序列化vs ctor注入和保护不变量,architecture,dependency-injection,inversion-of-control,ninject,constructor-injection,Architecture,Dependency Injection,Inversion Of Control,Ninject,Constructor Injection,我可能错过了一些明显的东西 但当我学会欣赏IoC和ctor注入的荣耀时,我很难将其与对象图序列化相协调。这两种模式兼容吗?为什么(或为什么不) 假设有: public class Foo { #region invariants private readonly List<IBar> _bars; private readonly Guid _id; #endregion public Foo( List<IBar> bars,

我可能错过了一些明显的东西

但当我学会欣赏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;
    }
}
公共类Foo
{
#区域不变量
专用只读列表栏;
专用只读Guid\u id;
#端区
公共Foo(列表栏、Guid id)
{
_棒材=棒材。不能拉伸(“棒材”);
_id=id.CannotBeNull(“id”);
}
公共列表栏{get{return_Bars;}}
//我想要序列化的其他一些状态
}
公共静态类
{
public static T CannotBeNull(此T对象,字符串paramName=”“)
{
如果(null==obj)抛出新的ArgumentNullException(paramName);
返回obj;
}
}
我喜欢通过ctor注入保护类不变量的铁壳安全性。它让我的对象确信他们将永远拥有他们所需要的。不变量的注入是否与存储库模式不一致?也许在某个地方有一个DTO层和一个工厂模式来弥补这个差距

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


PS:我知道IDeserializationCallback,但我不认为它对“私有只读”不变量有什么帮助

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

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

如果您有这个选项,您可以考虑切换到二进制序列化,它可以序列化私有成员变量。我能找到的最好的消息来源是


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

Mark Seemann有一篇关于该主题的文章。底线是:在边界应用程序不是面向对象的。如果发生某种转换(如序列化),您的类不变量将无法得到保护。

我可能会对repo模式感到困惑,我假设某些帮助repo的API需要公共setter。。。