如何设置我的项目以根据http请求创建实体框架上下文?

安德鲁·波兰德

我正在使用EF6进行C#MVC5项目。当前,上下文是在UnityConfig.cs类中创建的,该类是从Global中的Application_Start()调用的。请参阅下面的一些使用UnityConfig的类:

public static void RegisterComponents()
{
   var container = new UnityContainer();
   BlogSite.Domain.BlogSiteModelContainer context = new Domain.BlogSiteModelContainer();
   container.RegisterType<IBlogRepository, BlogRepository>(new InjectionConstructor(context));
}

问题是数据库可能会直接更新,因此EF上下文将变得不一致。因此,我需要更改它,以便每次有新的http请求时都重新加载它。

我发现PerRequestLifetimeManager可能是解决此问题的方法,但是,我找不到如何使用此方法的好例子。

我应该如何实施呢?或者,还有更好的方法?


因此,我尝试了一些尝试,但仍无所获。我意识到我可以使用该container.RegisterType()方法添加一个生命周期管理器,但是我假设这仅适用于存储库,不适用于Entity Framework上下文。

例如

container.RegisterType<IBlogRepository, BlogRepository>(new PerRequestLifetimeManager(), new InjectionConstructor(context));

我仍然不确定如何设置上下文的生存期。我意识到我可能不得不重新格式化代码,但是我在任何地方都找不到这种情况的示例。


我一直在做更多的研究,并研究了创建工作单元以在其中创建上下文并将其传递到存储库的想法。不知道这是否是最好的方法,但似乎是可行的方法。有什么想法吗?

安德鲁·波兰德

找到了解决方案。我需要创建一个UnitOfWork类,并在其中创建上下文和存储库。然后,我使用Unity通过PerRequestLifetimeManager生命周期管理器将UnitOfWork类注入到控制器中。

因此,我的UnitOfWork类(存储在我的DAL项目中)是:

public class UnitOfWork : IDisposable
{
    private static BlogSite.Domain.BlogSiteModelContainer context;
    public IBlogRepository blogRepository;

    public UnitOfWork()
    {
        context = new BlogSite.Domain.BlogSiteModelContainer();;
        blogRepository = new BlogRepository(context);
    }

    public void Save()
    {
        context.SaveChanges();
    }

    private bool disposed = false;

    protected virtual void Dispose(bool disposing)
    {
        if (!this.disposed)
        {
            if (disposing)
            {
                context.Dispose();
            }
        }
        this.disposed = true;
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
}

然后,我使用以下代码在我的UnityConfig类中简单地注册它:

container.RegisterInstance<UnitOfWork>(new UnitOfWork(), new PerRequestLifetimeManager());

然后,在我的控制器中,我对构造函数进行了一些小的更改,以使它们可以接受UnitOfWork而不是存储库。

例如

IBlogRepository blogRepo;

public BlogController(UnitOfWork unitOfWork)
{
   blogRepo = unitOfWork.blogRepository;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

实体框架上下文自动创建新实体

实体框架上下文问题

是否需要处置实体框架上下文对象

消除对实体框架上下文命名的依赖?

实体框架上下文生存期

在实体框架上下文中删除所有记录并重新创建的正确方法是什么?

在将列添加到数据库后,为什么我的实体框架上下文未更新?

实体框架:根据上下文跟踪实体

检查实体是否由实体框架上下文跟踪

如何根据实体框架中的上下文验证实体?

什么是实体框架上下文中的复杂类型

将对象添加到实体框架上下文大约需要1.5秒

实体框架上下文6.1.3是否未刷新/销毁?

使用Ninject指定实体框架上下文实现IDisposable

在例外情况下清除实体框架上下文

获取与实体框架上下文的非唯一匹配

如何使实体框架数据上下文为只读

实体框架对象上下文刷新

实体框架覆盖模型上下文

实体框架:无法加载上下文

不支持关键字:初始化实体框架上下文的“数据源”

ASP.NET Core Blazor 服务器中的实体框架上下文生命周期

在实体框架上下文中使用单例模式-基础提供程序在打开时失败

如何为我的应用程序创建每个请求上下文

实体框架从上下文重新加载实体

实体框架 - 无法引用实体上下文

实体框架如何从数据上下文分离所有特定类型的对象?

如何模拟实体框架并在模拟的上下文中获取新的插入值

在实体框架核心上下文中命名Fk