【问题标题】:Weak reference vs. Autofac resolve?弱参考与 Autofac 解决?
【发布时间】:2011-05-09 11:51:37
【问题描述】:

我有通过在存储库中查找 ID 来相互引用的 POCO 对象。我不希望对象之间具有强引用,因为存储库具有可能驱逐对象的缓存策略。引用它们的其他对象应该通过存储库重新加载它们。我使用 AutoFac 作为我的 IoC 容器。

非常简单的例子 - Region 对象引用 Currency 对象:

class Region
{
    ...
    public Currency GetCurrency()
    {
        ... Get the right Currency object
    }
    ...
}

我一直在尝试两种方法来做到这一点。第一个是每次都要求 AutoFac 解析货币存储库,以便我可以调用 Find(id)。

第二个是 WeakReference,我检查 .IsAlive 以查看我是否可以返回 .Target 或者我是否需要解析存储库并调用 Find,并对我得到的内容进行 WeakReference。

我一直在研究 WeakReference 带来的小额开销,但我不确定这与每次都要求 AutoFac 解析相比如何。

想法?

编辑:花费存储库需要的任何时间/精力来回答 .find - 我更感兴趣的是哪个更昂贵,WeakReference 及其开销或 AutoFac 分辨率。

【问题讨论】:

    标签: .net domain-driven-design repository autofac


    【解决方案1】:

    我只是想知道哪个更 开销 - 弱引用或重复 存储库的 IoC 决议。

    这很难回答,因为两者做的事情完全不同。开销也很大程度上取决于您将如何使用 autofac 注册/解析组件。

    例如:您是否打算注册为 InstancePerLifetimeScope(),并获得对 Lazy 的引用?

    使用弱引用,您持有对对象的引用,但告诉运行时可以收集它 - 您将处理它。

    使用 autofac,您要求容器构造和提供实例、注入依赖项,以及(可能)管理生命周期范围和处置。

    就开销而言 - 这两个问题相交的小区域(获取某物的实例)完全取决于您如何注册和解析组件,但我没有看到 WeakReference 不会出现的任何代码路径开销稍少(非常轻微)。不过,WR 的运行时开销要多一些,因此很难直接比较。

    【讨论】:

    • 换句话说,这可能无关紧要,但如果你真的在乎,请尝试这两个选项并比较结果
    【解决方案2】:

    访问数据库总是比处理弱引用的开销要大得多。对于这个特定的货币示例,只有少数对象,因此最好将它们全部保存在内存中,但对于较大的数据集,2 层方法(弱引用+存储库)似乎是合理的。

    【讨论】:

    • 感谢罗伯特,但要明确的是,存储库甚至可能不需要去数据库来回答这个问题。我只是想知道哪个开销更大 - 存储库的 WeakReference 或重复的 IoC 解决方案。
    猜你喜欢
    • 2012-11-22
    • 1970-01-01
    • 2018-10-16
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    • 2019-04-05
    相关资源
    最近更新 更多