我有POCO对象通过在存储库中查找ID来相互引用。我不希望对象之间具有强引用,因为存储库具有可能驱逐对象的缓存策略。引用它们的其他对象应该只通过存储库重新加载它们。我使用AutoFac作为我的IoC容器。
非常简单的示例 - Region对象引用Currency对象:
class Region
{
...
public Currency GetCurrency()
{
... Get the right Currency object
}
...
}
我一直在尝试两种方法来做到这一点。第一个是要求AutoFac每次都解析Currency存储库,因此我可以调用Find(id)。
第二个是WeakReference,我检查.IsAlive以查看我是否可以返回.Target或者如果我需要解析存储库并调用Find,并对我得到的内容进行WeakReference。
我一直在研究WeakReference强加的小额开销,但我确定每次都要求AutoFac解决这个问题。
思想?
编辑:利用存储库需要的任何时间/精力来回答.find - 我更感兴趣的是哪个更昂贵,WeakReference及其开销或AutoFac解析。
答案 0 :(得分:4)
我只是想知道哪一个更多 开销 - WeakReference或重复 存储库的IoC解决方案。
这很难回答,因为两者完全不同。开销也很大程度上取决于您使用autofac注册/解析组件的方式。
例如:您是否打算注册为InstancePerLifetimeScope(),并获得对Lazy的引用?
使用弱引用,您持有对象的引用,但告诉运行时可以收集它 - 您将处理它。
使用autofac,您要求容器构造并提供实例,注入依赖关系,以及(可能)管理生命周期范围和处置。
就开销而言 - 这两个问题相交的小区域(得到某个东西的实例)完全取决于你如何注册和解析组件,但我没有看到WeakReference不会的任何代码路径有轻微(非常轻微)的开销。但是WR有更多的运行时开销 - 所以很难直接比较。
答案 1 :(得分:2)
进入数据库总是比处理弱引用要多得多。对于这个特定的货币示例,只有少数几个对象可以通过将它们全部保存在内存中来获得最佳服务,但对于较大的数据集,2层方法(弱引用+存储库)似乎是合理的。