[英]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.