Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 具有多线程和存储库模式的EF5 Unity lifetime manager_.net_Entity Framework_Unity Container_.net 4.5 - Fatal编程技术网

.net 具有多线程和存储库模式的EF5 Unity lifetime manager

.net 具有多线程和存储库模式的EF5 Unity lifetime manager,.net,entity-framework,unity-container,.net-4.5,.net,Entity Framework,Unity Container,.net 4.5,我在这里看到了很多Q/a,所以说使用EF进行mlutithreading可能很困难 我得到的场景是,一个web API在数据库中将作业排队。Windows服务(目前实际上是一个控制台应用程序)接收这些作业,在多个线程上运行它们,并将结果存储在数据库中 目前我正在使用repository模式,并尝试最初仅使用主线程来更新数据库。这不起作用,因为工作的速度(远)快于主线程更新数据库的速度——特别是在有大量结果(数万)的情况下 下一种方法是按线程访问上下文,通过更改容器上的生存期管理器,我可以很容易地

我在这里看到了很多Q/a,所以说使用EF进行mlutithreading可能很困难

我得到的场景是,一个web API在数据库中将作业排队。Windows服务(目前实际上是一个控制台应用程序)接收这些作业,在多个线程上运行它们,并将结果存储在数据库中

目前我正在使用repository模式,并尝试最初仅使用主线程来更新数据库。这不起作用,因为工作的速度(远)快于主线程更新数据库的速度——特别是在有大量结果(数万)的情况下

下一种方法是按线程访问上下文,通过更改容器上的生存期管理器,我可以很容易地做到这一点,但这(可能)会导致并发问题,工作线程将作业状态更新为“完成”,但主线程不会知道,因为它的缓存副本仍在“进行中”

我认为下一种方法是每个请求都有上下文,但我担心会有大量的设置/拆卸,特别是在大量线程并行运行的情况下。无论如何,我要试一试,看看它有多好/有多坏

假设最后一个选项是可行的,那么如何让Unity为每个逻辑请求解析相同的上下文?也就是说如果我做了

Dim UnitOfWork = Container.Resolve(Of IUnitOfWork)
Dim UserRepo = Container.Resolve(Of IUserRepository)
Dim RoleRepo = Container.Resolve(Of IRoleRepository)
''Do Stuff
UnitOfWork.Commit
我需要所有对象使用相同的上下文。我是否需要使用自己的终身管理器,并为每个组使用一些独特的东西(比如新的Guid)


或者有更好的方法吗?

不,您只需要一个顶级对象来解析,它将是其他对象的提供者。例如:

public interface IDalProvider
{
    IUnitOfWork { get; }
    IUserReposiotry { get; }
    ...
}
该接口的实现将由Unity解决。由您决定是让实现实际创建实现,还是通过依赖项注入传递实现


在前一种情况下,您将向提供者实现注入上下文实例,并在构建工作单元和存储库实例时在内部使用它。在后一种情况下,您将直接将上下文实例注入到工作单元和存储库实现中,并将使用上下文、uow和存储库的每个解析生存期(同一实例将在单个解析中注入到所有依赖对象).

谢谢,但这提出了一个不同的问题-我是否需要构建我可能需要的每个存储库,甚至只使用1个?这取决于存储库的实现方式-它需要以某种方式获取当前上下文。要么通过依赖项注入将其传递,在这种情况下,必须将其与上下文一起创建,要么使用完全无状态的实现并将上下文传递给每个方法调用(这将破坏存储库的意义)。感谢您的澄清,但我的意思是在关于您的
IDalProvider
的示例中,如果我有30个表,并且想要使用其中的2个,我需要实例化30个存储库-或者可能最终会为不同的场景使用n个不同的IDalProvider。我是否应该关心实例化30个对象以使用2-3的开销?这就是为什么我也建议使用第一种方法。在这种情况下,提供者将成为工厂,它将包装正确的存储库实现的构造—您将不会在unity中定义这些实现。只有在第一次需要时才构建实现。
public interface IDalProvider
{
    IUnitOfWork { get; }
    IUserReposiotry { get; }
    ...
}