【问题标题】:How to update DB in singleton instance?如何在单例实例中更新数据库?
【发布时间】:2016-12-25 15:57:31
【问题描述】:

我的应用程序对处理程序类实例使用单例模式。它负责处理一些事件:

public class MyHandler
{
    public void HandlerEvent(object sender, EventArgs e)
    {
        //want to update DB here
    }
}

MyHandler 可能需要开始与 DB 交互。那我能做到吗?这是我的愿景:

  1. 只是将DbContext 附加为MyHandler 的单身人士。显然这是个坏主意。
  2. 使用 ASP.Net Core DI 功能并将DbContext 发送到MyHandler,但作为“每个请求一个”的实例。我认为在我的情况下(MyHandler 是单例)这类似于 1
  3. 通过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


【解决方案1】:

我看过一个 ef 核心教程 (https://docs.microsoft.com/en-us/ef/core/miscellaneous/configuring-dbcontext),据我了解,DbContextOptions - 只是一个内部带有配置参数的对象。如果我有同样的问题,我会使用第三种方式(with using),但会创建一个帮助器来注入参数或为此使用工厂。我在教程中找到了一个工厂的例子

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;

namespace MyProject
{
   public class BloggingContextFactory : IDbContextFactory<BloggingContext>
   {
       public BloggingContext Create()
       {
          var optionsBuilder = new DbContextOptionsBuilder<BloggingContext>();
          optionsBuilder.UseSqlite("Filename=./blog.db");

          return new BloggingContext(optionsBuilder.Options);
       }
   }
}

使用示例:

public class MyHandler
{
   public void HandlerEvent(object sender, EventArgs e)
   {
       // Or make 'Create' method static
       using(var context = new BloggingContextFactory().Create())
       {
                 . . . 
       }
   }
}

【讨论】:

  • 这种方法会破坏在 OnModelCreating 方法中实现的主要数据库配置吗?或者这个构造函数对于 OnModelCreating-configs 来说无关紧要?
  • @Mergasov 据我所知,新的 EF 核心正在以类似于 ASP.NET 核心的方式编写。这意味着我们没有 web.config 并将我们的属性存储在另一个文件中(例如 appsettings.json),所以我认为这种方法会破坏主要的数据库配置,但我不确定。观看docs.microsoft.com/en-us/ef/core/miscellaneous/… 和 ASP.NET Core 部分
猜你喜欢
  • 2017-05-06
  • 1970-01-01
  • 2019-01-19
  • 2020-01-20
  • 2014-06-08
  • 2012-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多