Ninject를 통해 종속성 삽입을 사용하는 프로젝트에서 작업하고 있습니다. 지금까지 잘 작동하고 DI를 많이 좋아하지만 일부 객체를 직렬화해야한다고 결정 했으므로 DI 패턴을 따르기가 어렵습니다. 공장에서 생성 한 객체를 직렬화하는 방법
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의 deserialization 생성자가 호출되면 다른 PickleFactory를 가져올 방법이 없습니다. 원래 PickleFactory는 BarFactory에 의해 Bar에 주어졌지만, Deserialization 생성자는 BarFactory에 의해 호출되지 않았습니다.
현재이 문제를 해결하기 위해 Bar의 모든 직렬화 가능 멤버를 BarDataObject라는 자체 클래스로 추출해야합니다. 그런 다음 BarDataObject를 직렬화 할 수는 있지만 Bar 자체는 만들지 않습니다. BarDataObject를 매개 변수로 받아들이고 BarDataObject의 모든 정보로 채워 넣은 Bar를 작성하는 BarFactory에 함수를 추가합니다.
그러나, 피클 을 가정도는 하나 직렬화 할 수없는 그것을 만든 공장에서 가지고 서비스 클래스가 있습니다. 그래서 Pickle에서도 DataObject를 추출해야하고, BarDataObject는 PickleDataObject를 유지해야합니다. 그리고 Pickle에는 데이터와 서비스가 혼합 된 멤버 변수가 있다고 가정합니다. 나는 그것을 위해 DataObject를 만들고 유지해야 할 것이다. 이것은 정말 불만처럼 보입니다. 특히 프로젝트에 직렬화해야 할 다른 많은 것들이 있다고 생각하면, 그들은 아마도 똑같은 문제에 직면 할 것입니다.
더 나은 솔루션이 있습니까? 내가 뭔가 잘못하고 있는거야, DI 현명한거야? 방금 DI와 Ninject로 작업을 시작했지만 서비스 클래스를 주입 한 객체를 직렬화하는 좋은 방법을 찾은 사람을 찾을 수없는 것 같습니다.
직렬화 정보를 받아들이는'BarFactory' 클래스에 생성자를 추가 할 수 있습니까? – Matthew
Foo는 어떤 유형의 객체입니까? 그것은 'newable'또는 'injectable'인가? (http://misko.hevery.com/2008/09/30/to-new-or-not-to-new/). –
@Matthew - 내가 원한다면 SerializationInfo를 어떻게 공장에 가져갈 수 있습니까? Bar의 private 생성자가 호출되었을 때, Bar 생성자에 이미 있기 때문에 Bar 생성을 요청하기에는 너무 늦습니다. Bar는 BarFactory에 대해 알지 못합니다. – tandersen