.net 具有多线程和存储库模式的EF5 Unity lifetime manager
我在这里看到了很多Q/a,所以说使用EF进行mlutithreading可能很困难 我得到的场景是,一个web API在数据库中将作业排队。Windows服务(目前实际上是一个控制台应用程序)接收这些作业,在多个线程上运行它们,并将结果存储在数据库中 目前我正在使用repository模式,并尝试最初仅使用主线程来更新数据库。这不起作用,因为工作的速度(远)快于主线程更新数据库的速度——特别是在有大量结果(数万)的情况下 下一种方法是按线程访问上下文,通过更改容器上的生存期管理器,我可以很容易地做到这一点,但这(可能)会导致并发问题,工作线程将作业状态更新为“完成”,但主线程不会知道,因为它的缓存副本仍在“进行中” 我认为下一种方法是每个请求都有上下文,但我担心会有大量的设置/拆卸,特别是在大量线程并行运行的情况下。无论如何,我要试一试,看看它有多好/有多坏 假设最后一个选项是可行的,那么如何让Unity为每个逻辑请求解析相同的上下文?也就是说如果我做了.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模式,并尝试最初仅使用主线程来更新数据库。这不起作用,因为工作的速度(远)快于主线程更新数据库的速度——特别是在有大量结果(数万)的情况下 下一种方法是按线程访问上下文,通过更改容器上的生存期管理器,我可以很容易地
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; }
...
}