在StructureMap中为控制台应用程序设置DbContext的最佳做法是什么?

YMC*_*YMC 1 structuremap poco entity-framework-4.1 dbcontext

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

谢谢

Lad*_*nka 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);
            ...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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