Aus diesem Grund habe ich meinen eigenen IoC-Behälter hergestellt, der (in C# /. NET) Einweg-Service-Wrapper zurückgibt, die bei der Entsorgung "das Richtige tun".
es:
- nichts tun, wenn:
- Das Objekt IDisposable
- Ist das nicht Container-scoped (in diesem Fall behält der Behälter, den er und Return-Spur von nicht implementiert das gleiche Objekt mehr als einmal, und wenn der Container entsorgt wird, wird das Objekt auch)
- Es ist nicht gepoolt
- Es ist nicht Singleton -scoped (das gleiche wie Container-scoped, aber eine Hierarchie von Behältern wird die Singleton-scoped Dienst in dem obersten Container speichern)
- Entsorgen des Dienstes (it Fabrik Umfang hat, und implementiert IDisposable)
- Return es an den Pool
Dies bedeutet, dass der gesamte Code, die meine Dienste verwendet innerhalb eines using-Block ist, aber die Absicht ist klar, zumindest für mich:
using (var service = container.Resolve<ISomeService>())
{
service.Instance.SomeMethod();
}
im Grunde ist es sa ys: einen Dienst auflösen, SomeMethod für die Dienstinstanz aufrufen und dann den Dienst verwerfen.
Da dem Verbraucher nicht bekannt ist, ob die Dienstinstanz entsorgt werden soll oder nicht, gab es entweder die Wahl, IDisposable-Implementierungen ganz zu ignorieren oder alle Dienste zu veräußern, die IDisposable implementieren. Für mich war keine gute Lösung.Die dritte Option bestand darin, die Dienstinstanz in ein Objekt zu verpacken, das wusste, was mit dem Dienst zu tun war, sobald der Wrapper entsorgt wurde.
Siehe auch http://stackoverflow.com/questions/987761/how-do-you-reconcile-idisposable-and-ioc und http://unity.codeplex.com/Thread/View.aspx?ThreadId=38588 – TrueWill