Я работаю над проектом, который использует внедрение зависимостей через Ninject. До сих пор это работало очень хорошо, и мне очень нравится DI, но теперь я решил, что мне нужно сериализовать некоторые объекты, и мне трудно сделать это, следуя шаблонам DI.
Скажем, у меня есть класс под названием Foo, у которого есть список Баров, и он делает их с помощью фабрики, например:
public class Foo
{
private List<Bar> _bars;
private BarFactory _barFactory;
...
public void MakeBar()
{
_bars.Add(_barFactory.MakeBar());
}
}
Вот Бар, который создается, когда _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 был передан Bar от BarFactory, но конструктор десериализации не вызывался BarFactory.
Мой текущий план решения этой проблемы состоит в том, чтобы извлечь все сериализуемые члены Bar в его собственный класс с именем BarDataObject. Тогда я бы сделал BarDataObject сериализуемым, но не сам Bar. Я бы добавил в BarFactory функцию, которая принимает BarDataObject в качестве параметра и создает для вас Bar, заполненный всей информацией из BarDataObject.
Однако предположим, что у Pickle такжеесть классы обслуживания, которые он получил от фабрики, которая его произвела, и которые также не могут быть сериализованы. Так что мне также пришлось бы извлекать DataObject из Pickle, а мой BarDataObject должен был бы удерживать PickleDataObject. А предположим, что у Pickle есть переменная-член, в которой есть и данные, и сервисы? Для этого мне также пришлось бы создавать и поддерживать DataObject. Это кажется настоящим обломом, особенно если учесть, что в моем проекте есть много других вещей, которые мне нужно сериализовать, и они, вероятно, столкнутся с той же проблемой.
Есть ли решение получше? Я делаю что-то не так, DI-мудрый? Я только начал работать с DI и Ninject, но я не могу найти никого, кто придумал бы хороший способ сериализации объектов, которые были внедрены с классами обслуживания.