在 Asp.Net MVC中,默认模板随Startup.Auth中的Startup class一起提供.cs
public partial class Startup
{
// For more information on configuring authentication, please visit http://go.microsoft.com/fwlink/?LinkId=301864
public void ConfigureAuth(IAppBuilder app)
{
// Configure the db context, user manager and signin manager to use a single instance per request
app.CreatePerOwinContext(ApplicationDbContext.Create);
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create);
根据此模板中的注释,将为每个请求创建一个应用程序数据库上下文的实例。
在我的应用程序中,我使用存储库模式并将应用程序数据库上下文注入存储库。就我而言,我使用的是Ninject,如果需要,它可以在多个存储库之间共享相同的上下文。
有没有办法在 Startup.Auth 中使用相同的注入的 ApplicationDbContext?不太确定这是否是更改默认模板的好主意,同时我们在 1 个请求中创建相同上下文的 2 个实例......
在我的 Ninject 代码中,我将ApplicationDbContext绑定到自身,如下所示:
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<ApplicationDbContext>().ToSelf().InRequestScope();
不确定将上下文绑定到自身而不是创建接口是否是一种不好的做法?(虽然它工作正常(。
不太确定这是否是将上下文绑定到自身的不良做法 而不是创建接口?
将DbContext
注册为自身和每个请求生存期是很正常的。
我个人喜欢实现IDbContext
接口,这样当我对存储库进行单元测试时,模拟起来更干净。因此,我的存储库依赖于抽象而不是具体的实现。
public class ApplicationDbContext : DbContext, IDbContext
{
}
IDb上下文
public interface IDbContext
{
DbSet<MyEntity> MyEntities { get; set; }
...
}