Время жизни DataContext, LinqToSql - PullRequest
4 голосов
/ 03 мая 2011

Я нашел в Интернете статью, в которой рассказывается, как реализовать шаблон хранилища. Реализация выглядит примерно так:

class ProductRepository : IProductRepository
{

    var context;
    public ProductRepository() {
        this.context = new MyDataBaseDataContext(); 
    }
    // the rest of methods
}

Но я не совсем уверен, правильно ли это, что случилось с контекстом? Сборщик мусора утилизирует этот объект? Или лучше мне создать контекст с , используя (...) {} оператор?

Ответы [ 3 ]

2 голосов
/ 03 мая 2011

Repository не должен открывать контекст данных, ему необходимо передать DataContext - так как он не должен владеть им. Допустим, у вас есть операция, которая должна быть в транзакции и включает несколько репозиториев, что бы вы сделали?

Вам необходимо использовать UnitOfWork шаблон .

В этом шаблоне UoW (который включает DataContext) передается в хранилище.

Практически , ProductManager на бизнес-уровне создаетUnit Of Work.

1 голос
/ 04 мая 2011

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

class ProductRepository : IProductRepository, IDisposable
{
    var context;

    public ProductRepository() {
        this.context = new MyDataBaseDataContext(); 
    }

    // the rest of methods

    public void Dispose()
    {
        if (context != null)
        {
            context.Dispose();
            context = null;
        }
    }
}
0 голосов
/ 03 мая 2011

Полагаю, это зависит от того, нужны ли вам транзакции между операциями с репозиторием и ваша потребность в отслеживании изменений.Текст данных Datacontext может быть очень полезным, поскольку он позволяет вам извлекать кучу объектов, изменять их в приложении, а затем просто вызывать SubmitChanges / RollbackChanges в любое удобное для вас время.Но если вы не предоставляете эту функциональность в своем хранилище, вам, вероятно, будет лучше, просто «используя» экземпляр в каждом методе хранилища, поскольку это сохранит использование памяти и ресурсы для отслеживания изменений.

...