gpt4 book ai didi

c# - 如何序列化工厂创建的对象

转载 作者:太空狗 更新时间:2023-10-29 17:49:46 24 4
gpt4 key购买 nike

我正在开发一个通过 Ninject 使用依赖注入(inject)的项目。到目前为止,它运行良好,我非常喜欢 DI,但现在我决定需要序列化一些对象,但我发现按照 DI 模式很难做到这一点。

假设我有一个名为 Foo 的类,它有一个 Bars 列表,并通过工厂制作它们,如下所示:

public class Foo
{
private List<Bar> _bars;
private BarFactory _barFactory;

...

public void MakeBar()
{
_bars.Add(_barFactory.MakeBar());
}
}

这是 Bar,它是在 _barFactory.MakeBar() 被调用时生成的。我希望 Bar 是可序列化的:

public class Bar : ISerializable
{
private List<IPickle> _pickles;
private PickleFactory _pickleFactory;

public Bar(PickleFactory factory)
{
_pickleFactory = factory;
}

public void MakePickle(int x)
{
_pickles.Add(_pickleFactory.MakePickle(x));
}

public void GetObjectData(SerializationInfo info, StreamingContext context)
{
//serialize member variables here
}

//Constructor called during deserialization
private Bar(SerializationInfo info, StreamingContext context)
{
//fill in member variables with data from SerializationInfo
}
}

请注意,Bar 有自己的工厂和一系列泡菜。问题在于:当调用 Bar 的反序列化构造函数时,我没有任何方法让它成为另一个 PickleFactory。原来的PickleFactory是BarFactory给Bar的,但是BarFactory并没有调用反序列化构造函数。

我目前解决这个问题的计划是将 Bar 的所有可序列化成员提取到它自己的类 BarDataObject 中。然后我将使 BarDataObject 可序列化,但不是 Bar 本身。我会向 BarFactory 添加一个函数,它接受 BarDataObject 作为参数并为您构建一个 Bar,其中填充了来自 BarDataObject 的所有信息。

但是,假设 Pickle 具有从制造它的工厂获得的服务类,这些类也不能被序列化。因此,我还必须从 Pickle 中提取一个 DataObject,而我的 BarDataObject 必须保留一个 PickleDataObject。假设 Pickle 也有一个混合了数据和服务的成员变量?我也必须为此制作和维护一个 DataObject。这看起来真的很糟糕,特别是考虑到我的项目还有许多其他我需要序列化的东西,而且他们可能会面临同样的问题。

那么有更好的解决方案吗?我做错了什么,DI-wise?我刚刚开始使用 DI 和 Ninject,但我似乎找不到任何人想出一个好的方法来序列化注入(inject)了服务类的对象。

最佳答案

以我的经验,只有服务类应该有依赖关系,服务类永远不应该被序列化。

事实上,你有一个你想要序列化的类,但它依赖于注入(inject)的服务,这对我来说似乎是一种代码味道。

很难准确地说出你想用 Bar 完成什么, 但据我所知,我建议制作 Pickle成为 POCO,并使用 List<Pickle>而不是自定义 Bar类。

或者,如果 Bar除了泡菜之外,还有其他可序列化的信息,制作Bar具有 Pickles 属性的 POCO:

public class Bar
{
public string Name {get;set;}
public List<Pickle> Pickles {get;set;}
}

因为 POCO 没有依赖性,它们不应该需要工厂,所以这个类应该是完全可序列化的。如果您想在 Bar 上执行复杂的功能s 和 Pickle s,它们应该被抽象成单独的实用程序服务,这些服务需要 Bar s 和 Pickle s 作为它们的方法参数。

关于c# - 如何序列化工厂创建的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9727943/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com