Tôi đang làm việc trên một dự án sử dụng tiêm phụ thuộc thông qua Ninject. Cho đến nay, nó đang làm việc rất tốt, và tôi thích DI rất nhiều, nhưng bây giờ tôi đã quyết định tôi cần serialize một số đối tượng, và tôi đang tìm thấy nó khó khăn để làm điều đó sau DI mẫu.Cách sắp xếp các đối tượng được tạo bởi các nhà máy
Nói rằng tôi có một lớp được gọi là Foo, trong đó có một danh sách các Bars, và làm cho họ thông qua một nhà máy, như thế này:
public class Foo
{
private List<Bar> _bars;
private BarFactory _barFactory;
...
public void MakeBar()
{
_bars.Add(_barFactory.MakeBar());
}
}
Dưới đây là Bar, mà được thực hiện khi _barFactory.MakeBar()
được gọi. Tôi muốn Bar có thể được tuần tự hóa:
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
}
}
Lưu ý rằng Bar có nhà máy riêng và bộ sưu tập dưa chua. Đây là vấn đề: khi các nhà xây dựng deserialization của Bar được gọi, tôi không có bất kỳ cách nào để có được nó PickleFactory khác. Bản gốc PickleFactory đã được BarFactory trao cho Bar, nhưng nhà xây dựng deserialization không được BarFactory gọi.
Kế hoạch hiện tại của tôi để giải quyết vấn đề này là trích xuất tất cả các thành viên có thể tuần tự hóa của Bar thành lớp riêng của nó được gọi là BarDataObject. Sau đó, tôi sẽ làm cho BarDataObject serializable, nhưng không phải Bar chính nó. Tôi sẽ thêm một chức năng để BarFactory mà chấp nhận một BarDataObject như một tham số và xây dựng một Bar cho bạn điền vào với tất cả các thông tin từ BarDataObject.
Tuy nhiên, giả sử Pickle cũng có các lớp dịch vụ mà nó nhận được từ nhà máy sản xuất nó, không thể được sắp xếp theo thứ tự. Vì vậy, tôi sẽ phải trích xuất một DataObject từ Pickle là tốt, và BarDataObject của tôi sẽ phải giữ một PickleDataObject. Và giả sử Pickle có một biến thành viên với một hỗn hợp dữ liệu và dịch vụ? Tôi sẽ phải thực hiện và duy trì một DataObject cho điều đó là tốt. Điều này có vẻ như một con số thực sự, đặc biệt là xem xét dự án của tôi có nhiều thứ khác mà tôi cần phải sắp xếp theo thứ tự, và có thể họ sẽ phải đối mặt với cùng một vấn đề.
Vì vậy, có giải pháp tốt hơn không? Tôi có làm gì sai không, DI-wise? Tôi vừa mới bắt đầu làm việc với DI và Ninject, nhưng tôi dường như không thể tìm thấy bất kỳ ai đang tìm ra cách tốt để sắp xếp các đối tượng đã được tiêm các lớp dịch vụ.
Bạn có thể thêm một hàm tạo vào lớp 'BarFactory' của bạn chấp nhận thông tin tuần tự hóa không? – Matthew
Loại đối tượng nào là Foo? Nó có phải là 'mới' hay 'tiêm' được không? (http://misko.hevery.com/2008/09/30/to-new-or-not-to-new/). –
@Matthew - Nếu tôi đã làm, làm thế nào tôi sẽ nhận được SerializationInfo đến nhà máy? Khi nhà xây dựng tư nhân của Bar được gọi, đã quá muộn để yêu cầu nhà máy sản xuất Bar, vì chúng tôi đã ở trong nhà xây dựng Bar, và Bar không biết gì về BarFactory trong mọi trường hợp. – tandersen