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

时间:2014-04-28 14:25:40

标签: c# dependency-injection unity-container asp.net-mvc-5 entity-framework-6

我正在使用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()方法添加一个生命周期管理器,但我认为它只适用于存储库而不适用于实体框架上下文。

e.g。

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

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


我一直在做更多的研究,并且已经研究了创建工作单元以在其中创建上下文并将其传递给存储库的想法。不确定它是否是最好的前进方式,但它似乎是可行的。有什么想法?

1 个答案:

答案 0 :(得分:0)

找到解决方案。我需要创建一个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而不是存储库。

E.g。

IBlogRepository blogRepo;

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