【问题标题】:Resource management in decoupled applications解耦应用程序中的资源管理
【发布时间】:2013-04-28 15:48:42
【问题描述】:

我正在使用 Unity、Prism 构建解耦应用程序。

我担心的问题是服务中的资源管理。在示例中更容易解释: 想象一下,我们有一些接口 IDataRetriever 为我们提供某种数据。实现被注册为一个实例。 这个接口的实现可以基于任何东西:文件(FileDataRetriever)、Sql Server(SqlServerDataRetriever),甚至是简单的字典。配置要使用的具体实现(可能通过配置文件,但没关系)。

应用程序完成工作后,根据服务实现,它有时应该释放资源(例如关闭连接、关闭文件等)或不释放资源(例如,使用 Dictionary 时),但是当我使用解耦抽象时,我不知道两件事: 1.什么时候应该释放资源 2.具体实现是否需要资源释放。

我可以想到引导程序实现 IDisposable 的场景,并检查每个服务的 IDisposable 实现,并为所有模块调用 Dispose(这意味着所有模块也必须实现 IDisposable)但它只是没有看起来像处理此类事情的正确方法(太复杂)?

【问题讨论】:

    标签: .net database mvvm prism


    【解决方案1】:

    您可以决定在您的数据检索器完成操作后立即释放资源(实际上这更可取)。在这种情况下,资源的释放将隐含在对您的 GetData 或作为您的客户端代码使用的抽象的一部分的等效方法的调用中。

    或者,如果您不希望在检索数据之前的某个时间点释放资源,那么您需要在抽象上公开Release 或等效方法。如果不需要,强制服务实现这个方法是很麻烦的,所以你可以把这个方法放在一个单独的接口上,只为适当的服务实现它。

    然后,您的客户端代码可以检查注入的服务是否在适当的时间实现此接口,并在适当的情况下调用Release 方法。

    【讨论】:

    • 在每次操作后释放资源是不可能的。使用 Release 方法实现接口,我相信与实现我在初始帖子中描述的 IDisposable 相同。我目前正在考虑终结器,它看起来不适合使用它们吗?
    • 您不应该在终结器中调用 Dispose 或 Close,请参阅 msdn.microsoft.com/en-us/library/…。终结器似乎在这里不合适。您可以使用 IDisposable 是的,只是在需要它的类型上,并在您的客户端中对其进行测试。
    猜你喜欢
    • 1970-01-01
    • 2013-12-04
    • 2013-09-11
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-03
    相关资源
    最近更新 更多