Z tego powodu stworzyłem własny kontener IoC, który zwraca (w C#/.NET) jednorazowe owijki serwisowe, które po utylizacji "zrobią dobrze" w odniesieniu do usługi.
Be go:
- nic nie robić, gdy:
- Obiekt nie wykona IDisposable
- Nie jest pojemnik o zasięgu (w tym przypadku pojemnik będzie śledzić i powrócić ten sam obiekt więcej niż jeden raz, a gdy pojemnik zostanie usunięty, obiekt też będzie)
- Nie jest on łączony
- To nie jest singleton -scoped (tak samo jak o zasięgu pojemnika, ale hierarchii kontenerów będzie przechowywać usługi o zasięgu singleton w najwyższej pojemniku)
- utylizować usługi (ma zakres fabryczny i implementuje IDisposable)
- Powrót to do puli
oznacza to, że cały kod, który korzysta z moich usług jest wewnątrz przy użyciu bloku, ale intencja jest bardziej jasne, przynajmniej dla mnie:
using (var service = container.Resolve<ISomeService>())
{
service.Instance.SomeMethod();
}
zasadniczo SA ys: rozwiąż usługę, wywołaj metodę SomeMethod na instancji usługi, a następnie pozbądź się usługi.
Ponieważ wiedza o tym, czy zlikwidować instancję usługi, nie jest dostępna dla konsumenta, istniał albo wybór ignorowania całkowicie implementacji IDisposable, albo pozbywanie się wszystkich usług, które implementują IDisposable. Nie było dla mnie dobrym rozwiązaniem.Trzecim wyborem było zawarcie instancji usługi w obiekcie, który wiedział, co zrobić z usługą po usunięciu opakowania.
Zobacz również http://stackoverflow.com/questions/987761/how-do-you-reconcile-idisposable-and-ioc i http://unity.codeplex.com/Thread/View.aspx?ThreadId=38588 – TrueWill