Что я сделал лично, так это сделал хранилище одноразовым. Затем вы получаете конструкции, такие как:
void DeleteCustomer(int id)
{
using(var repos = GetRepos())
{
var customer = repos.GetAll<Customer>().Single(x => x.Id == id);
repos.Delete(customer);
repos.SaveChanges();
}
}
Это можно реализовать, создав контекст в репозитории ctor
и разместив его в реализации Dispose()
.
Вы должны убедиться, что вы не добавляете, не меняете, не удаляете объекты и не выбираете из одного контекста. Создается контекст для «последней» единицы работы.
Вы должны быть осторожны с такими вещами, как это:
IQueryable<Customer> GetCustomers()
{
using(var repos = GetRepos())
{
return repos.GetAll<Customer>();
}
}
void Test()
{
// This will throw an exception, because it extends the linq query
// while the context is disposed.
var customers = GetCustomers().Where(x => x.Id == 123);
}
В этом случае лучше переместить хранилище как можно дальше:
IQueryable<Customer> GetCustomers(MyRepository repos)
{
return repos.GetAll<Customer>();
}
void Test()
{
using(var repos = ...)
{
var customers = GetCustomers(repos).Where(x => x.Id == 123);
}
}