Какова лучшая практика для настройки DbContext в StructureMap для консольного приложения? - PullRequest
1 голос
/ 18 августа 2011

Я использую StructureMap, EF 4.1 / POCO.Консольное приложение предполагает выполнение 2 последовательных операций над некоторым набором данных, скажем, операция1 и операция2.Я установил DbContext как синглтон.Это вызывает проблему в операции 2, так как операция 1 оставила некоторый мусор в своем DbContext, который мешает операции 2, работает хорошо.В то же время я не могу настроить DbContext, так как «на вызов», поскольку операция 1 использует 2 хранилища, совместно использующих один и тот же DbContext, проходящий через их конструктор.Поэтому в идеале мне нужно переинициализировать / сбросить / очистить DbContext перед операцией2.Есть идеи?

Спасибо

1 Ответ

6 голосов
/ 18 августа 2011

Просто используйте два разных контекста.Нет лучшего решения для сброса контекста, чем создание нового.Если вы боретесь с вашей текущей архитектурой, просто улучшите ее, чтобы поддержать новый сценарий.Вместо передачи экземпляра контекста передайте фабрику контекста, которая сможет создать вам столько экземпляров контекста, сколько вам нужно.То же самое с репозиториями - вы можете иметь фабрику для создания новых экземпляров репозитория по требованию.

Редактировать на примере:

Предположим, вы используете 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);
            ...
        }
    }
}

Это был пример, когда вы передаете фабрику для контекста, но вы можете сделать то же самое для репозитория, если хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...