我可能会遗漏一些明显的东西......
但是当我学会欣赏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;
}
}
我喜欢通过注射器保护不变量的铁质安全性。它让我的对象确信他们将永远拥有他们所需要的东西。注入不变量是否与存储库模式不一致?也许在某个地方有一个DTO层和工厂模式可以弥补差距......?
寻找sagely建议......这两种模式是否兼容?为什么(或为什么不)?
PS:我知道IDeserializationCallback,但我看不出它对'private readonly'不变量的帮助
答案 0 :(得分:5)
Mark Seemann撰写了一篇关于该主题的文章At the Boundaries, Applications are Not Object-Oriented。底线是:在边界处应用程序不是面向对象的。如果发生某种翻译(如序列化),则无法保护您的类不变量。
答案 1 :(得分:0)
我不清楚您的问题与存储库模式有什么关系。您需要序列化您的存储库吗?
在任何情况下,使用XML序列化都需要在属性上设置setter。像你一样,我更喜欢将类不变量保留给构造函数,所以我也觉得这很痛苦。这只是在.Net中使用XML序列化的现实,所以你没有选择(我认为你可以编写自定义序列化器,但这是一个痛苦的IIRC)。
如果你有选项,你可能会看到切换到二进制序列化,它可以序列化私有成员变量。我能找到的最佳来源是here。
编辑:我想更直接地回答你的问题:模式本身并不矛盾,但技术实现(使用XML序列化时)使它们不兼容。