如何在單例實例中更新數據庫?

asp.net-core c# entity-framework-core singleton

我的應用程序使用單例模式作為處理程序類實例。它負責處理一些事件:

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()) {...}對我來說這是一個很好的方法,但實體框架核心實現的DbContextOptions需要DbContextOptions作為其構造函數的參數。如果我為XDbContext聲明無參數構造函數,那麼它會拋出異常。

有任何想法嗎?

熱門答案

我已經看過一個ef核心教程( https://docs.microsoft.com/en-us/ef/core/miscellaneous/configuring-dbcontext ),據我DbContextOptionsDbContextOptions - 只是一個包含配置參數的對象。如果我有同樣的問題,我會使用第三種方式(使用),但會創建一個幫助器來注入參數或使用工廠。我在教程中找到了一個工廠示例

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())
       {
                 . . . 
       }
   }
}


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因