簡體   English   中英

如何使用Dependecy注入管理n層asp.net應用程序中的數據庫上下文?

[英]How to manage db context in n-tier asp.net application with dependecy injection?

我有3層架構-asp.net Web API,BLL和DAL。 我使用Ninject作為依賴注入器,在層之間注入數據庫上下文和對象。 作為ORM,我使用Entity Framework。 db上下文的注入在DAL中處理。 因此,每當實例化BLL中的某個存儲庫時,也會創建db上下文的新實例。 我這樣做是這樣的:

public class UserRepository : IUserRepository
{
    private IChatDbModel _chatDbModel;

    public UserRepository(IChatDbModel chatDbModel)
    {
        this._chatDbModel = chatDbModel;
    }

可以肯定地說,可以解決我的問題的PerWebRequest在低於Web api的較低層中不可用。 僅Web api層具有有關http請求生存期的信息,因此可以使用Ninject.Web.Common庫。

我的問題是,有沒有一種方法可以像在這種體系結構中使用PerWebRequest一樣為整個請求共享數據庫上下文? 還是真的有必要為存儲庫的每個新實例創建數據庫上下文的新實例?

編輯

我忘了提到,在每個層中,我都引用Ninject庫,並且為特定層注冊映射。 DAL中的方法如下所示:

    public static void Register(IKernel kernel)
    {
        kernel.Bind<IChatDbModel>().To<ChatDbModel>();
    }

在BLL中,它看起來像這樣:

    public static void Register(IKernel kernel)
    {
        kernel.Bind<IUserRepository>().To<UserRepository>();
        NinjectDataAccess.Register(kernel);
    }

在API中,它看起來像這樣,位於NinjectWebCommon.cs中:

    private static void RegisterServices(IKernel kernel)
    {
        kernel.Bind<IUserLogic>().To<UserLogic>();
        NinjectLogic.Register(kernel);            
    }     

因此在每一層中,我不僅要映射其自己的對象,還要調用位於其下方的該層的注冊方法(如果有的話),並且使用這樣的機制,我可以注冊每一層的依賴關系映射而無需引用API中的所有層,其中除了BLL之外,我不應引用其他任何層,因此在我的情況下為DAL。 如果我在API層中引用DAL,則可以定義映射並調用PerWebRequest,因為我有對象,但是我不是,我認為應該由體系結構避免這種情況,還是我錯了?

您可以通過注冊OnePerRequestHttpModule http模塊來實現每個請求實例,該模塊在內部使用HttpContext生命周期來跟蹤已注冊的類型並將其在請求/響應生命周期的末尾進行處置。

安裝Ninject.Web.Common軟件包后,您必須在NinjectWebCommon.cs中進行操作(一旦安裝了nuget軟件包,它將自動添加)

DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule))

對於類型注冊,您可以執行以下操作

//register IChatDbModel with per request scope
kernel.Bind<IChatDbModel>().To<ChatDbModel>().InRequestScope();

//register repositories with default transient scope
kernel.Bind<IUserRepository>().To<UserRepository>();

您所有的存儲庫都是臨時的,因此在注入它們的任何地方,都將提供一個單獨的實例,但是您的DBContext實例將根據請求創建和處置。

我假設您已經向Web api項目添加了BAL和DAL引用,以便Web api項目可以訪問IChatDbModel以在Ninject內核中執行類型注冊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM