Проектирование внедрения зависимости и повторного использования единого контекста данных - PullRequest
3 голосов
/ 17 августа 2010

В настоящее время я только начинаю внедрять внедрение зависимостей, чтобы начать тестирование своего кода и много раз сталкивался с проблемой, которую не могу понять.

Мой текущий сценарий:

У меня есть один класс (foo.cs), который активен все время, пока работает служба Windows. Он отвечает за опрос базы данных на наличие новых сообщений, затем отправляет их и обновляет базу данных, чтобы отразить успешность отправки.

Моя проблема в том, что foo.cs имеет зависимость для доступа к данным (Message Repository - контекст данных linq-to-sql), поэтому он внедряется через конструктор и его жизненный цикл совпадает с foo. Везде, где я читаю, говорится, что время жизни контекста данных должно быть одной единицей работы. Таким образом, мне нужно вводить фактический тип, который я хочу использовать, и создавать его каждый раз, когда я хочу выполнить одну единицу работы в foo, а не передавать уже созданный репозиторий, который остается в живых в течение всей продолжительности службы.

Ответы [ 2 ]

4 голосов
/ 17 августа 2010

Одна возможность: не давайте классу Foo контекст данных непосредственно во время конструирования, а предоставьте ему класс / интерфейс «фабрика» контекста данных, реализующий метод, который создает свежий контекст данных при каждом вызове.

** EDIT *** * 1005

Если мое описание неясно, вот набросок того, что я имею в виду:

interface IDataContextFactory
{
    ??? CreateContext();
}

class DataContextFactory : IDataContextFactory
{
    public ??? CreateContext()
    {
        // Create and return the LINQ data context here...
    }
}

class Foo
{
    IDataContextFactory _dataContextFactory;

    public Foo(IDataContextFactory dataContextFactory)
    {
        _dataContextFactory = dataContextFactory;
    }

    void Poll()
    {
        using (var context = _dataContextFactory.CreateContext())
        {
            //...
        }
    }
}
2 голосов
/ 17 августа 2010

Эта ссылка обсуждает различные альтернативы.Если ваша обработка фактически является последовательностью UOW типа «все или ничего», тогда глобальный контекст может действительно быть в порядке.Если у вас есть большая сложность, тогда подходы, такие как per-thread или factory в ссылочных статьях, могут быть более подходящими.В последнем случае вы вводите фабрику, а не контекст.

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