【发布时间】:2016-12-25 15:57:31
【问题描述】:
我的应用程序对处理程序类实例使用单例模式。它负责处理一些事件:
public class MyHandler
{
public void HandlerEvent(object sender, EventArgs e)
{
//want to update DB here
}
}
MyHandler 可能需要开始与 DB 交互。那我能做到吗?这是我的愿景:
- 只是将
DbContext附加为MyHandler的单身人士。显然这是个坏主意。 - 使用 ASP.Net Core DI 功能并将
DbContext发送到MyHandler,但作为“每个请求一个”的实例。我认为在我的情况下(MyHandler是单例)这类似于 1 - 通过
using操作符执行,即作为原子事务,例如using(var context = new XDbContext()) {...}对我来说这是一个很好的方法,但是 Entity Framework Core 实现的 DbContext 需要DbContextOptions作为其构造函数的参数。如果我为 XDbContext 声明无参数构造函数,则会引发异常。
有什么想法吗?
【问题讨论】:
-
为什么不在每个请求中更新实例?例如,在您的
MyHandler类中有一个DbContext属性,并在其中更新您的XDbContext实例,您无需担心以前的实例,因为它们将通过 GC 收集。 -
@Emad 在我的情况下是
HandlerEvent处理来自 azure 服务总线的消息,即它不依赖于 http-requests -
我的观点仍然有效,尽管 Egorikas 的答案使用工厂模式做同样的事情。您可以在我的 DbContext 属性的 get 方法中创建工厂的整个代码。
标签: c# asp.net-core singleton entity-framework-core