可以反转控制和RAII一起玩吗?

Rob*_*uld 5 raii inversion-of-control

我只是在阅读控制反转(IOC),它让我感到困扰,似乎它让内存管理变得痛苦.当然,似乎ioc主要用于垃圾收集环境(Net,Java,Scripting),而我关注的是非gc设置.

我担心的是,IOC在某种程度上违背了RAII,因为我们将资源生命周期与对象生命周期分离开来.这增加了复杂性是否会困扰其他人?真正的问题是,有什么技术可以让事情顺利进行?

ang*_*son 3

正是出于这个原因,我制作了自己的 IoC 容器,它返回(在 C#/.NET 中)一次性服务包装器,在处理后,它将针对服务“做正确的事情”。

就这样吧:

  • 当出现以下情况时,什么也不做:
    • 该对象未实现 IDisposable
    • 不是容器范围的(在这种情况下,容器将跟踪它并多次返回同一对象,并且当容器被处置时,该对象也将被处置)
    • 它不是汇集的
    • 它不是单例范围的(与容器范围相同,但容器的层次结构会将单例范围的服务存储在最顶层的容器中)
  • 处置服务(它具有工厂范围,并实现 IDisposable)
  • 将其放回池中

这意味着使用我的服务的所有代码都位于 using 块内,但意图更清晰,至少对我来说:

using (var service = container.Resolve<ISomeService>())
{
    service.Instance.SomeMethod();
}
Run Code Online (Sandbox Code Playgroud)

基本上它说:解析服务,在服务实例上调用 SomeMethod,然后处置该服务。

由于消费者不知道是否处置服务实例,因此要么选择完全忽略 IDisposable 实现,要么处置所有实现 IDisposable 的服务。对我来说这都不是一个好的解决方案。第三种选择是将服务实例包装在一个对象中,该对象知道一旦包装器被处理后如何处理服务。