1

我使用 StructureMap,EF 4.1/POCO。控制台应用程序假设对一组数据运行 2 个后续操作,比如说 operation1 和 operation2。我将 DbContext 设置为单例。这会导致 operation2 出现问题,因为 operation1 在其 DbContext 中留下了一些垃圾,从而阻止 operation2 正常工作。同时,我无法将 DbContext 设置为“每次调用”,因为操作 1 使用 2 个存储库共享通过其构造函数的相同 DbContext。所以理想情况下,我需要在 operation2 之前重新初始化/重置/清理 DbContext。有任何想法吗?

谢谢

4

1 回答 1

6

只需使用两种不同的上下文。没有比创建新上下文更好的解决方案来重置上下文。如果您正在与当前架构作斗争,只需对其进行改进以支持新场景。而不是传递上下文实例,而是传递一个上下文工厂,它将能够根据需要为您创建尽可能多的上下文实例。与存储库相同 - 您可以让工厂按需创建新的存储库实例。

编辑示例:

假设您使用的是EFv4.1 Update 1。它提供了新的界面IDbContexFactory<TContext>。你可以这样定义你的类:

public class YourClass
{
    private readonly IDbContextFactory<IYourContext> _factory;

    public YourClass(IDbContextFactory<IYourContext> factory) 
    {
        _factory = factory;
    }

    public void Operation1() 
    {
        using (IYourContext context = _factory.Create()) 
        {
            RepositoryA repository = new RepositoryA(context);
            RepositoryB repository = new RepositoryB(context);
            ...
        }
    }

    public void Operation2()
    {
        using (IYourContext context = _factory.Create()) 
        {
            RepositoryA repository = new RepositoryA(context);
            RepositoryB repository = new RepositoryB(context);
            ...
        }
    }
}

这是您将工厂传递给上下文的示例,但如果您愿意,您可以对存储库执行相同的操作。

于 2011-08-18T19:28:37.290 回答