[英]Should I Dispose instances that are not Owned?
我在一个项目中使用Autofac,但我尝试做正确的事情。 因此,我一直在阅读文档并找到Owned<T>
。 当我想自己处理某些事情时,似乎这是使用的正确关系类型,例如,一次性DbContext
。
因此,我将所有注入的工厂Func<DbContext>
更改为Func<Owned<DbContext>>
。
唯一的事情是感觉像Lazy<T>
这样的行为有点肮脏,并根据非框架类型将Owned放在使用中...
完全不使用Owned
是错误的吗?
这样处理我的班级不拥有的实例时是否存在问题?
public class MyClass
{
private readonly Func<DbContext> _dbcFactory;
private MyClass(Func<DbContext> dbcFactory)
{
_dbcFactory = dbcFactory; // nullcheck etc;
}
private void TheMethodWhoUpdate(String newName)
{
using(var dbc = _dbcFactory())
{
var ent = dbc.Table.Single(x => x.id == 3);
end.Name = newName;
dbc.SaveChanges();
}
}
}
我能想象到的(因为我在文档上找不到线索)可能会导致一些性能问题,因为也许autofac会跟踪创建的DbContext实例并尝试再次对其进行处理,从而浪费了一些时间(可能很小)...但是也许我错了,我应该坚持使用指南 。
为什么不只使用代码示例中所示的Func<DbContext> dbcFactory
?
您不应该这样做,有两个原因。
DbContext
注册为InstancePerLifetimeScope
则多个对象(包含在同一生存期范围内)将获得DbContext
的相同实例-如果其中一个对象将其从另一个对象中移出,则是有问题的。 当仅拥有一个dbcontext实例(或仅有其他任何类)时,这不是一个选择(有很多原因我不在这里讨论),创建新实例是完全可以的。
在坚持依赖注入模式的同时,获得工厂注入而不只是一个实例是获得它的方法。
关于Func<Owned<T>>
与Func<T>
我刚刚发现让示波器执行其工作的艰难方法,这是一个坏主意。
我使用了Func<Owned<T>>
方法,但是即使我处置了所有拥有的作用域,我最终也会遇到巨大的内存泄漏。
对我而言真正有效的方法是注入一个创建dbContext
的工厂(或仅在有限的时间内需要执行任何操作,或者需要控制生命周期的任何方法)。
该工厂应注册为一个实例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.