2011-05-09 86 views
2

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

很简单的例子 - Region对象引用的货币对象:

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

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

第二个是WeakReference,我检查.IsAlive,看看我是否可以返回.Target,或者如果我需要解决存储库并调用Find,并为我所得到的WeakReference做一个WeakReference。

我一直在研究WeakReference施加的小额开销,但我确信如何比较每次要求AutoFac进行解析。

想法?

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

回答

4

我只是想知道哪个更 开销 - WeakReference的或为库重复 国际奥委会的决议。

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

例如:您是否计划注册为InstancePerLifetimeScope(),并获取Lazy参考?

由于弱引用,你持有一个对象的引用,但告诉运行时它可以收集它 - 你会处理这个。

使用autofac,您要求容器构造并提供实例,注入依赖关系,以及(可能)管理生命周期范围和处置。因此,就开销而言 - 这两个关注点相交的小区域(获取某个事物的实例)完全取决于您注册和解析组件的方式,但是我没有看到任何代码路径,而WeakReference不会在这个位置t稍微(非常轻微)少开销。尽管WR有一些运行时间的开销 - 所以很难直接比较。

+1

换句话说,它可能并不重要,但如果你真的在乎尝试两种选择并比较结果 – 2011-05-09 18:17:59

2

去数据库总是比处理弱引用要花费更多。对于这个货币的特例,只有少数几个对象,所以最好通过将它们全部留在内存中来实现,但对于较大的数据集,2层方法(弱引用+存储库)似乎是合理的。

+0

感谢罗伯特,但要清楚,存储库可能甚至不需要去数据库来回答查找。我只是想知道哪些是更多的开销 - WeakReference或重复的IoC解决方案的存储库。 – n8wrl 2011-05-09 15:11:28