2010-11-08 3 views
1

У меня довольно прямолинейный сценарий, который я пытаюсь решить, но я нажимаю несколько кирпичных стен с Виндзором - возможно, я пытаюсь решить проблему не так путь?Зависимость от зависания Замка Виндзора - восстановление зависимостей для существующего экземпляра

У меня есть тип, который называется Foo следующим образом:

public class Foo 
{ 
    [NonSerialized] 
    private IBar bar; 

    public IBar Bar 
    { 
     get { return this.bar; } 
     set { this.bar = value; } 
    } 

    public Foo(IBar bar) 
    { 
    } 
} 

я создаю экземпляр через контейнер обычным способом:

var myFoo = container.Resolve<Foo>(); 

Зависимость IBar регистрируется с контейнером и получает решена, когда объект создается. Теперь, когда тип был создан, мне нужно его сериализовать, и я не хочу сериализовать IBar, поэтому он помечен атрибутом NonSerialized.

Затем мне нужно десериализовать объект и вернуть его в прежнее состояние. Как достичь этого с помощью Castle Windsor? У меня уже есть экземпляр, он просто не хватает его зависимостей.

Если бы я использовал Unity, я бы использовал BuildUp() для решения проблемы, но в этом случае я хочу использовать Castle Windsor.

ответ

2

Кажется, что у Foo есть несколько проблем. Попробуйте отделить часть данных от поведения, создавая новый класс для данных и использовать его в качестве свойства в Foo класса:

[Serializable] 
public class FooData 
{ 
} 

public class Foo 
{ 
    private FooData data = new FooData(); 

    public IBar Bar { get; private set; } 

    public FooData Data { get; set; } 

    public Foo(IBar bar) 
    { 
    } 
} 

Когда вы имеете эту конструкцию на месте вы можете десериализации FooData и использовать его в a Создано Foo:

var foo = container.Get<Foo>(); 
foo.Data = DeserializeData(); 
+0

Нет FooData, есть только бар. Бар не может быть сериализован. Бар даже не нужно открывать, но он должен быть восстановлен, когда объект десериализован. – Steve

+0

Пока нет 'FooData'. Но вы собираетесь его создать; вот что я говорю ;-) – Steven

+0

Я не буду следовать за тобой! IBar - это, вероятно, репозиторий, который Foo использует для загрузки/сохранения данных. Как я могу получить свой репозиторий, или Bar, обратно в Foo post-deserialize? – Steve

Смежные вопросы