C# 保护业务对象不受更改影响

C# 保护业务对象不受更改影响,c#,.net,design-patterns,architecture,c#-2.0,C#,.net,Design Patterns,Architecture,C# 2.0,在我的应用程序中,我将业务数据保存为一个巨大的对象,其中包含许多小对象、属性等 为了根据这些数据打印报告,我创建了一个打印模块 在打印模块中,我需要访问几乎所有的属性、子对象和字段,因此我将HugeObject作为参数传递给打印模块 问题是,通过引用传递的out HugeObject可能会在打印模块中意外更改 如何保护HugeObject免受更改 要深度复制整个对象,序列化和反序列化是一种很好的方法。您可以找到一篇关于CodeProject的文章,其中描述了实现细节 要深度复制整个对象,序列化和

在我的应用程序中,我将业务数据保存为一个巨大的对象,其中包含许多小对象、属性等

为了根据这些数据打印报告,我创建了一个打印模块

在打印模块中,我需要访问几乎所有的属性、子对象和字段,因此我将HugeObject作为参数传递给打印模块

问题是,通过引用传递的out HugeObject可能会在打印模块中意外更改


如何保护HugeObject免受更改

要深度复制整个对象,序列化和反序列化是一种很好的方法。您可以找到一篇关于CodeProject的文章,其中描述了实现细节

要深度复制整个对象,序列化和反序列化是一种很好的方法。您可以找到一篇关于CodeProject的文章,其中描述了实现细节

即使您需要在打印模块中使用几乎所有的
HugeEntity
,我建议您创建一个特殊的
PrintableEntity
,并使用特殊的
EntityToPrintableAdapter
您可以将业务实体调整为
PrintableEntity
。通过这种方式,您可以保持打印模块与业务模块实体的解耦,这样业务实体就不会泄漏到其他模块中。所以,即使在将来对可打印实体更改的需求中,您的业务层也保持不变,只需更新适配器即可


若您决定克隆对象,请参阅,下面是我提供的
DeepCopy()
扩展方法以及NUnit测试线束。

即使您需要打印模块中使用几乎所有的
HugeEntity
,我建议创建一个特殊的
PrintableEntity
,并使用特殊的
EntityToPrintableAdapter
您也可以将业务实体调整为
PrintableEntity
。通过这种方式,您可以保持打印模块与业务模块实体的解耦,这样业务实体就不会泄漏到其他模块中。所以,即使在将来对可打印实体更改的需求中,您的业务层也保持不变,只需更新适配器即可

若您决定克隆对象,请参阅,下面是我提供的带有NUnit测试线束的扩展方法