To pytanie dotyczy Unity Container, ale myślę, że ma ono zastosowanie do dowolnego kontenera zależności.Wstrzyknięcie zależności: wstrzykiwanie częściowo zainicjowanych obiektów
Mam dwie klasy z okrągłymi zależności:
class FirstClass
{
[Dependency]
public SecondClass Second { get; set; }
}
class SecondClass
{
public readonly FirstClass First;
public SecondClass(FirstClass first)
{
First = first;
}
}
Technicznie jest to możliwe do wystąpienia i prawidłowo wstrzykiwać zależności zarówno od nich, jeśli traktować je jako singletons:
var firstObj = new FirstClass();
var secondObj = new SecondClass(firstObj);
firstObj.Second = secondObj;
Kiedy próbuję zrobić to samo z Unity, dostaję 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!
Rozumiem, że Jedność próbuje chronić mnie przed używaniem częściowo zainicjowanych obiektów, ale chcę mieć tę ochronę jako opcję, a nie obowiązek.
Pytanie: czy obecne zachowanie jest nie do zniesienia?
Nie lubię tej jedności nie może instancję klasy, ale mogę to zrobić ręcznie. Od dowiązania MDSN, które podałeś, żadna z następujących rzeczy nie jest prawdziwa dla mojego przypadku: -Obiekty generowane przez wstrzyknięcie konstruktora, które odwołują się do siebie w swoich parametrach konstruktora -Obiekty generowane przez zastrzyk konstruktora, gdy wystąpienie klasy jest przekazywane jako parametr do własnego konstruktora -Obiekty generowane przez wstrzyknięcie wywołania metody, które odwołują się do siebie -Obiekty generowane przez zastrzyk właściwości (setter), które odnoszą się do siebie –
Problem polega na tym, że przez kilka chwil "FirstClass" żyje bez obiektu zależności, co oznacza, że nie jest tak naprawdę ważny. Wszystko to w zasadzie zależy od tego, co robią twoje obiekty, kiedy twoja druga klasa spróbuje połączyć się z pierwszą, gdzie pierwsza oczekiwałaby, że obiekt zależny będzie dostępny, a następnie zawiedzie. Takie okrężne łańcuchy są problematyczne z kilku powodów, dlatego powinieneś unikać, jeśli to możliwe. –
Wolałbym uzyskać NRE niż StackOverflowException, szczególnie biorąc pod uwagę, że mogę ręcznie tworzyć instancje moich obiektów. –