C# 如何在singleton实例中更新DB?

C# 如何在singleton实例中更新DB?,c#,asp.net-core,singleton,entity-framework-core,C#,Asp.net Core,Singleton,Entity Framework Core,我的应用程序对处理程序类实例使用单例模式。它负责处理一些事件: public class MyHandler { public void HandlerEvent(object sender, EventArgs e) { //want to update DB here } } MyHandler可能需要启动与DB的交互。那我能做吗?这就是我的愿景: 只需将DbContext作为singleton附加到MyHandler。显然这是个坏主意 使用ASP.

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

public class MyHandler
{
    public void HandlerEvent(object sender, EventArgs e)
    {
        //want to update DB here
    }
}
MyHandler可能需要启动与DB的交互。那我能做吗?这就是我的愿景:

  • 只需将
    DbContext
    作为singleton附加到
    MyHandler
    。显然这是个坏主意
  • 使用ASP.Net核心DI功能并将
    DbContext
    发送到
    MyHandler
    ,但作为实例“每个请求一个”。我认为在我的例子中(
    MyHandler
    是singleton),这类似于1
  • 通过
    使用
    操作符,即作为原子事务,例如
    使用(var-context=new-XDbContext()){…}
    对我来说这是一个好方法,但实体框架核心实现的DbContext需要
    DbContextOptions
    作为其构造函数的参数。如果我为XDbContext声明无参数构造函数,那么它会抛出一个异常

  • 有什么想法吗?

    我看过ef核心教程(),据我所知,
    DbContextOptions
    -只是一个包含配置参数的对象。如果我有同样的问题,我会使用第三种方法(使用),但会创建一个用于注入参数的帮助器或为此使用工厂。我在教程中找到了一个工厂的例子

    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);
           }
       }
    }
    

    为什么不在每个请求中更新实例?例如,在您的
    MyHandler
    类中有一个
    DbContext
    属性,在该属性中,您不必担心以前的实例,因为它们将通过GC收集。@Emad在我的例子中
    HandlerEvent
    处理从azure服务总线到达的消息,也就是说,它不依赖于http请求。虽然Egorikas的答案使用工厂模式做同样的事情,但我的点仍然有效。您可以在我的DbContext属性的get方法中创建工厂的整个代码。这种方法会破坏在OnModelCreating方法中实现的主要DB配置吗?或者这个构造函数对于onmodelcreatingconfigs并不重要?@Mergasov正如我所知,新的efcore是以类似ASP.NET core的方式编写的。这意味着我们没有web.config并将我们的属性存储在另一个文件中(例如appsettings.json),因此我认为这种方法可能破坏主要的数据库配置,但我不确定。监视和ASP.NET核心部分
    public class MyHandler
    {
       public void HandlerEvent(object sender, EventArgs e)
       {
           // Or make 'Create' method static
           using(var context = new BloggingContextFactory().Create())
           {
                     . . . 
           }
       }
    }