tan*_*sen 9 c# serialization dependency-injection ninject
我正在开发一个通过Ninject使用依赖注入的项目.到目前为止,它运行得很好,我很喜欢DI,但现在我已经决定需要序列化一些对象,而且我发现在DI模式之后很难做到这一点.
假设我有一个名为Foo的类,它有一个Bars列表,并通过工厂生成它们,如下所示:
public class Foo
{
private List<Bar> _bars;
private BarFactory _barFactory;
...
public void MakeBar()
{
_bars.Add(_barFactory.MakeBar());
}
}
Run Code Online (Sandbox Code Playgroud)
这是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
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,Bar有自己的工厂和一系列泡菜.这就是问题:当Bar的反序列化构造函数被调用时,我没有办法让它获得另一个PickleFactory.原始的PickleFactory由BarFactory提供给Bar,但是反序列化构造函数没有被BarFactory调用.
我目前解决这个问题的计划是将Bar的所有可序列化成员提取到它自己的名为BarDataObject的类中.然后我会使BarDataObject可序列化,但不是Bar本身.我会向BarFactory添加一个函数,它接受一个BarDataObject作为参数,并为你填充一个Bar,其中包含来自BarDataObject的所有信息.
但是,假设Pickle 还有从制造它的工厂获得的服务类,它们也无法序列化.所以我也必须从Pickle中提取DataObject,而我的BarDataObject必须保留一个PickleDataObject.假设Pickle有一个成员变量,混合了数据和服务呢?我也必须为此创建和维护一个DataObject.这似乎是一个真正的无赖,特别是考虑到我的项目有许多其他我需要序列化的东西,他们可能会面临同样的问题.
那么有更好的解决方案吗?我做错了什么,DI明智吗?我刚刚开始使用DI和Ninject,但我似乎找不到任何人想出一个很好的方法来序列化注入了服务类的对象.
根据我的经验,只有服务类应该具有依赖性,而服务类永远不应该进行序列化.
你有一个想要序列化的类,但依赖于注入服务的类,这对我来说似乎是一种代码味道.
很难准确地说出你想要完成Bar什么,但从我所看到的,我建议制作Pickle一个POCO,并使用一个List<Pickle>而不是一个自定义Bar类.
或者,如果Bar除了Pickles之外还有其他可序列化信息,请Bar使用Pickles属性制作POCO:
public class Bar
{
public string Name {get;set;}
public List<Pickle> Pickles {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
因为POCO不具有依赖关系,所以它们不应该要求工厂,因此这个类应该是完全可序列化的.如果您希望在Bars和Pickles 上执行复杂的函数,则应将它们抽象为单独的实用程序服务,这些服务将Bars和Pickles作为其方法参数.
| 归档时间: |
|
| 查看次数: |
1788 次 |
| 最近记录: |