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

发布于 2024-11-30 10:39:01 字数 278 浏览 2 评论 0原文

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

谢谢

I use StructureMap, EF 4.1/POCO.
Console app supposes to run 2 consequent operations upon some set of data, lets say operation1 and operation2. I set DbContext up as an singleton. This causes problem in operation2 as operation1 left some trash in its DbContext that prevent operation2 works well. In the same time I can not set up DbContext as 'per call' coz operation1 uses 2 repositories sharing the same DbContext passing through their constructor. So ideally I need reinitialize/reset/cleanup DbContext before operation2. Any ideas?

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

冷血 2024-12-07 10:39:01

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

编辑示例:

假设您正在使用 EFv4.1更新1。它提供了新的接口IDbContexFactory。您可以这样定义您的类:

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);
            ...
        }
    }
}

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

Simply use two different contexts. There is no better solution to reset context then creating a new one. If you are fighting with your current architecture simply improve it to support new scenario. Instead of passing context instance pass a context factory which will be able to create you as many context instances as you need. Same with repositories - you can have factory to create a new repository instances on demand.

Edit with example:

Let's suppose that you are using EFv4.1 Update 1. It offers new interface IDbContexFactory<TContext>. You can define your class this way:

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);
            ...
        }
    }
}

This was example where you pass factory for context but you can do the same for repository if you want to.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文