Proprio per questo motivo ho creato il mio contenitore IoC che restituisce (in C# /. NET) i wrapper di servizio usa e getta che, una volta smaltiti, "faranno la cosa giusta" per quanto riguarda il servizio.
Che si tratti di:
- Non fare nulla, quando:
- L'oggetto non significa implementare IDisposable
- non è il contenitore con ambito (nel qual caso il contenitore non mancherà di tenere traccia di esso e il ritorno lo stesso oggetto più di una volta, e quando il contenitore viene eliminato, l'oggetto sarà troppo)
- Non raggruppato
- Non è singleton con scope (stesso contenitore con scope, ma una gerarchia di contenitori memorizzerà il servizio singleton con ambito nel contenitore più alto)
- smaltimento del servizio (ha portata fabbrica, e implementa IDisposable)
- Return al pool
Ciò significa che tutto il codice che utilizza i miei servizi è all'interno di un utilizzando blocco, ma l'intento è più chiaro, almeno per me:
using (var service = container.Resolve<ISomeService>())
{
service.Instance.SomeMethod();
}
fondamentalmente iT SA ys: risolve un servizio, chiama SomeMethod sull'istanza del servizio, quindi elimina il servizio.
Poiché la conoscenza dell'eliminazione dell'istanza del servizio o non è disponibile per il consumatore, è stata scelta la possibilità di ignorare del tutto le implementazioni IDisposable o di eliminare tutti i servizi che implementano IDisposable. Nessuna delle due era una buona soluzione per me.La terza scelta era di avvolgere l'istanza del servizio in un oggetto che sapeva cosa fare con il servizio una volta che il wrapper era stato eliminato.
fonte
2009-10-10 16:25:51
Vedere anche http://stackoverflow.com/questions/987761/how-do-you-reconcile-idisposable-and-ioc e http://unity.codeplex.com/Thread/View.aspx?ThreadId=38588 – TrueWill