Именно по этой причине я создал свой собственный контейнер IoC, который возвращает (в C # /. NET) одноразовые упаковщики сервисов, которые при утилизации будут "делать правильные вещи" в отношении сервиса.
Будь то:
- Ничего не делать, когда:
- Объект не реализует IDisposable
- Не ограничен контейнером (в этом случае контейнер будет отслеживать его и возвращать один и тот же объект более одного раза, а при удалении контейнера объект тоже будет)
- Это не объединено
- Это не одноэлементная область (такая же, как у контейнера, но иерархия контейнеров будет хранить сервис с одноэлементной областью в самом верхнем контейнере)
- Утилизация службы (она имеет фабричную область применения и реализует IDisposable)
- Верните его в бассейн
Это означает, что весь код, который использует мои сервисы, находится внутри блока using, но цель более ясна, по крайней мере для меня:
using (var service = container.Resolve<ISomeService>())
{
service.Instance.SomeMethod();
}
в основном говорится: разрешите службу, вызовите SomeMethod для экземпляра службы и затем удалите службу.
Поскольку знание о том, распоряжаться экземпляром службы или нет, недоступно для потребителя, был либо выбор, либо просто игнорировать реализации IDisposable, либо избавляться от всех служб, которые реализуют IDisposable. Ни один не был хорошим решением для меня. Третий вариант заключался в том, чтобы обернуть экземпляр службы в объект, который знал, что делать со службой после удаления оболочки.