首页 > 解决方案 > 使用 StructureMap 设置实体框架上下文的正确方法

问题描述

我们使用我不太熟悉的 StructureMap 4.7.1。我们还在 ASP.Net MVC 应用程序中使用 Entity Framework 6。我们的解决方案分为多个项目,例如

--Objects
--Business Layer
--Data Layer
--MVC Web App

一切都使用依赖注入,因此 MVC 控制器从业务层获取服务,该服务从数据层获取存储库,该存储库获取数据上下文实例。我们为 StructureMap 设置了注册表文件,如下所示。

public class DefaultRegistry : Registry
{
    public DefaultRegistry()
    {
        Scan(
            scan =>
            {
                scan.SingleImplementationsOfInterface();
                scan.TheCallingAssembly();
                scan.WithDefaultConventions();
                scan.With(new ControllerConvention());
            });

        For<IDbContext>().HybridHttpOrThreadLocalScoped().Use(new DbContext(DataSources.Database));
    }
}

理想情况下,我们希望为每个 http 请求创建一个新的数据上下文实例,我相信它由 HybridHttpOrThreadedLocalScoped 范围控制。但是,它似乎并没有那样工作。如果它是这样工作的,那么我应该能够在请求之间直接对数据库进行更改,并在下一个请求时让它显示数据库中的最新值。但它没有这样做。这就像有一个上下文的单例实例在数据出现缓存时被传递。而且,我可以在请求之间等待很长时间(30 分钟,一个小时),但仍然没有从数据库中获取最新信息。

那么,将其设置为每个 http 请求获取单个实例的正确方法是什么?我已经尝试了以下但仍然没有运气。

For<IDbContext>().HttpContextScoped().Use(new DbContext(DataSources.Database));
For<IDbContext>().Use(new DbContext(DataSources.Database)).Trasient();

标签: entity-framework-6structuremap4

解决方案


推荐阅读