2016-12-25 68 views
1

我的應用程序使用單例模式處理類實例。它負責處理一些事件:如何在單例實例中更新數據庫?

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

它可能是MyHandler將需要開始與數據庫交互。我能做到嗎?有我的願景:

  1. 只是強加DbContext作爲單身人士在MyHandler。顯然這是一個壞主意。
  2. 使用ASP.Net核心DI特性,併發送至DbContextMyHandler,但作爲一個實例「每個請求一個」。我想在我的情況(MyHandler是單身),這類似於1
  3. 不必通過using操作,即作爲原子事務,例如爲using(var context = new XDbContext()) {...}至於我這是一個好方法,但實體框架核心實現的DbContext需要DbContextOptions作爲它的構造函數的參數。如果我爲XDbContext聲明無參數構造函數,則會引發異常。

任何想法?

+0

你爲什麼不更新在每個請求的實例?例如,在你的MyHandler類中有一個'DbContext'屬性,並且它將得到'XDbContext'實例的更新,你不需要擔心以前的實例,因爲它們將通過GC進行收集。 – Emad

+0

@Emad在我的情況'HandlerEvent'處理從蔚藍的服務總線的消息到達,即它不依賴於HTTP的請求 – Mergasov

+0

我的觀點仍然是有效的,雖然Egorikas的答案確實使用工廠模式是一樣的。你可以在我的DbContext屬性的get方法中創建工廠的完整代碼。 – Emad

回答

1

我見過一個ef核心教程(https://docs.microsoft.com/en-us/ef/core/miscellaneous/configuring-dbcontext),據我瞭解,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); 
     } 
    } 
} 

例工廠的一個例子:

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

這樣的方法能否破壞在OnModelCreating方法中實現的主要DB配置?或者這個構造函數對於OnModelCreating-configs不是問題? – Mergasov

+0

@Mergasov據我所知,新的EF內核正在像ASP.NET內核那樣編寫。這意味着我們沒有web.config並將我們的屬性存儲在另一個文件中(例如appsettings.json),所以我想這種方法可能會破壞主要的DB配置,但我不確定。觀看https://docs.microsoft.com/en-us/ef/core/miscellaneous/connection-strings和ASP.NET Core部分 – Egorikas

相關問題