シングルトンインスタンスでDBを更新するには?

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機能を使用し、 DbContextMyHandlerを送信しますが、インスタンスとして「要求ごとに1つ」を使用します。私は私の場合( MyHandlerはシングルトンだと思う)これは1に似ています
  3. それを行うusing等のために、すなわちアトミックトランザクションとして、演算子をusing(var context = new XDbContext()) {...} 、それは良い方法だが、Entity Frameworkのコア実装のDbContextが必要私としてDbContextOptionsそのコンストラクタの引数としての。 XDbContextのためのパラメータのないコンストラクタを宣言すると、例外がスローされます。

何か案は?

人気のある回答

私はefコアのチュートリアル( https://docs.microsoft.com/en-us/ef/core/miscellaneous/configuring-dbcontext )を見てきました。私が理解しているように、 DbContextOptionsはその内部に構成パラメータを持つオブジェクトに過ぎません。同じ問題があった場合は、3番目の方法を使用しますが、パラメータを注入するためのヘルパーを作成するか、またはファクトリを使用してこれを作成します。私はチュートリアルで工場の例を見つけました

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は合法ですか? はい、理由を学ぶ