Câu hỏi này là về Unity Container nhưng tôi đoán nó có thể áp dụng cho bất kỳ container phụ thuộc nào.Tiêm phụ thuộc: tiêm các đối tượng được khởi tạo một phần
Tôi có hai lớp với phụ thuộc vòng tròn:
class FirstClass
{
[Dependency]
public SecondClass Second { get; set; }
}
class SecondClass
{
public readonly FirstClass First;
public SecondClass(FirstClass first)
{
First = first;
}
}
Về mặt kỹ thuật nó có thể nhanh chóng và chính xác tiêm phụ thuộc cho cả hai nếu đối xử với họ như độc thân:
var firstObj = new FirstClass();
var secondObj = new SecondClass(firstObj);
firstObj.Second = secondObj;
Khi tôi cố gắng làm tương tự với Unity, tôi nhận được StackOverflowException:
var container = new UnityContainer();
container.RegisterType<FirstClass>(new ContainerControlledLifetimeManager());
container.RegisterType<SecondClass>(new ContainerControlledLifetimeManager());
var first = container.Resolve<FirstClass>(); // StackOverflowException here!
var second = container.Resolve<SecondClass>(); // StackOverflowException here too!
Tôi hiểu rằng Unity cố gắng bảo vệ tôi khỏi việc sử dụng các đối tượng được khởi tạo một phần nhưng tôi muốn có sự bảo vệ này như một lựa chọn, không phải là một nghĩa vụ.
Câu hỏi: hành vi hiện tại có thể không thể thực hiện được không?
tôi không thích Unity rằng không thể nhanh chóng lớp nhưng tôi có thể làm điều đó bằng tay. Từ liên kết MDSN mà bạn đưa ra, không có trường hợp nào sau đây là đúng đối với trường hợp của tôi: -Bộ phận được tạo thông qua phép xây dựng tham chiếu lẫn nhau trong tham số hàm dựng của chúng -Objects được tạo thông qua hàm tạo constructor trong đó một thể hiện của một lớp được chuyển thành tham số cho hàm tạo riêng của nó -Khối từ được tạo ra thông qua phép gọi phương thức tham chiếu đến nhau -Bộ phận được tạo thông qua biến thuộc tính (setter) tham chiếu lẫn nhau –
Vấn đề là trong một khoảnh khắc, "FirstClass" không có đối tượng phụ thuộc, có nghĩa là nó không thực sự hợp lệ. Tất cả điều này về cơ bản phụ thuộc vào những gì đối tượng của bạn làm khi xây dựng, nếu lớp thứ hai của bạn sẽ cố gắng gọi vào cái đầu tiên, nơi mà người thứ nhất mong đợi đối tượng phụ thuộc có sẵn, thì nó sẽ thất bại. Chuỗi thông tư như thế này là có vấn đề, vì nhiều lý do, vì vậy bạn nên cố gắng tránh, nếu có thể. –
Tôi muốn nhận NRE hơn là StackOverflowException, đặc biệt là tính đến việc tôi có thể khởi tạo các đối tượng của mình theo cách thủ công. –