我知道这个问题的整个背景有点具体,但我会尽力解释它。我正在从一个电子商务平台到nopCommerce进行相当大的输入。
nopCommerce与Autofac一起使用作为依赖注入容器。将一个产品导入nopCommerce涉及对nopCommerce表的一些查询,最后是对products表的插入。这些步骤重复了很多次,并且实体框架上下文变得更大,因为它必须跟踪越来越多的实体并尝试检测更改并确定必须保留多少个对象。
我想要做的是,在循环的每次迭代中,更新上下文,因此它只跟踪与当前迭代关联的实体。显然我想实现这一点,尽量不要修改(尽可能多)nopCommerce核心。在容器配置中,显式设置了每个http请求给出EF上下文实例(我想要避免的事情,因为我需要每次迭代一个新实例)。
一种简单的方法是:
foreach job in jobs
Eject all instances in container
service1 = Container.RequestInstance<SomeServiceINeed>
service2 = Container.RequestInstance<SomeServiceINeed2>
DoTheJob
问题是,我不知道如何使用Autofac来实现这一目标。我一直在尝试创建一个新的ContainerBuilder并更新现有的ContainerBuilder,但_context.GetHashCode将始终返回相同的实例。
有关最好的方法吗?
编辑:
正如评论中所建议的那样,我试图在实际范围内获取实例。基本上是:
using (var lifeTime = EngineContext.Current.ContainerManager.Container.BeginLifetimeScope())
{
service1 = lifeTime.Resolve<SomeServiceINeed>();
service2= lifeTime.Resolve<SomeServiceINeed2>();
..............
}
但我得到了这个例外:
从作用域中看不到带有匹配'AutofacWebRequest'的标记的作用域 该实例被请求。这通常表示一个组件 SingleInstance()组件正在请求按HTTP请求注册 (或类似的场景。)在Web集成下,始终请求依赖关系 DependencyResolver.Current或ILifetimeScopeProvider.RequestLifetime, 从来没有从容器本身。
我正在尝试解决的服务显然还取决于许多不同的存储库和已在容器布线(应用程序启动)中定义的其他服务。其中一些配置为'PerHttpRequest'。
非常感谢!