答案 0 :(得分:3)
一个选项可能是采用工厂模式,因此IoC容器直接创建的对象永远不需要自行处理,例如
IBinaryDataProviderFactory factory =
ServiceContainer.Global.Resolve<IBinaryDataProviderFactory>();
using(IBinaryDataProvider provider = factory.CreateProvider())
{
...
}
下行增加了复杂性,但它确实意味着容器永远不会创建开发人员应该处理的任何东西 - 它始终是显式代码来执行此操作。
如果你真的想让它变得明显,那么工厂方法的名称就像CreateDisposableProvider()。
答案 1 :(得分:2)
(免责声明:我正在根据java的内容回答这个问题。虽然我编写C#但我没有在C#中代理任何内容,但我知道这是可能的。抱歉java术语)
您可以让IoC框架检查正在构造的对象以查看它是否支持 IDisposable接口。如果没有,您可以使用动态代理将IoC框架提供的实际对象包装到客户端代码中。此动态代理可以实现IDisposable,因此您始终可以向客户端提供IDisposable。只要您使用的界面应该相当简单?
然后,当对象是IDisposable时,您只会遇到与开发人员进行通信的问题。我不太确定如何以一种很好的方式做到这一点。
答案 2 :(得分:1)
您实际上提出了一个非常糟糕的解决方案:您的IService
合同违反了SRP,这是一个很大的禁忌。
我建议将所谓的“单身”服务与所谓的“原型”服务区分开来。 “singleton”的生命周期由容器管理,容器可以在运行时查询特定实例是否实现IDisposable
并在关闭时调用Dispose()
。
另一方面,管理原型完全是调用代码的责任。