Как сериализовать объекты, созданные фабриками

Я работаю над проектом, который использует внедрение зависимостей через 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, но я не могу найти никого, кто придумал бы хороший способ сериализации объектов, которые были внедрены с классами обслуживания.

9
задан tandersen 15 March 2012 в 20:49
поделиться