Во-первых, я бы позаботился о том, чтобы независимо от того, что является моим «расходуемым» объектом (хранилищем или единицей работы, в зависимости от вашей настройки), реализовано IDisposable
.Когда ваш захваченный объект удаляется, вы должны будете удалить свой базовый контекст.
Например, если вы используете UnitOfWork
в качестве расходуемого объекта (тот, который создается и вызывается в вашем приложении), это будет выглядеть примерно так:
public class UnitOfWork : IDisposable
{
// All the other stuff you had before plus:
public void Dispose ()
{
if (_context != null)
{
_context.Dispose ();
}
}
}
(Примечание: это также можно сделать в ваших хранилищах, если они используются напрямую)
И затем у вас есть нескольковарианты в вашем приложении.Если вы собираетесь использовать UnitOfWork
напрямую, вы можете использовать его следующим образом:
public void SomeMethodThatAccessesYourData ()
{
using (var unitOfWork = new UnitOfWork (/*Load in the context*/))
{
// Access your data here.
}
}
Или в своем веб-формах или MVC-объекте вы можете использовать инжектор конструктора и утилизировать его, когда веб-формы илиОбъект MVC утилизируется:
// If you're using MVC:
public class MyController : Controller
{
private UnitOfWork _unitOfWork;
public MyController (UnitOfWork unitOfWork)
{
_unitOfWork = unitOfWork;
}
public override Dispose (bool Disposing)
{
if (Disposing && _unitOfWork != null)
{
_unitOfWork.Dispose ();
}
}
}
Та же идея относится к веб-формам Page
.
Основная причина использования перегрузки конструктора - Инверсия управления (МОК) .Он помогает как с модульным тестированием, так и с рабочим кодом при использовании с IoC Container .WebForms плохо подходит для IoC, но с MVC это действительно просто.
Edit
Я не вижу связи с вашими репозиториями иединица работы.Обычно вы обращаетесь к репозиториям из единицы работы или, в других реализациях, запрашиваете единицу работы из вашего целевого репозитория.В вашей реализации (которая, как я понимаю, не ваша), кажется, нет необходимости в обоих.
Редактировать 2
Если UoW является избыточным для вашего приложения,и вы знаете, что вы можете использовать IoC для внедрения IContext, и у вас не так много репозиториев, вы можете сделать что-то вроде:
public IRepository<T> : IDisposable { }
public IJobRepository : IRepository<Job> { /* All the stuff you put here */ }
public JobRepository : IJobRepository
{
private IContext _context;
...
public void Dispose ()
{
if (_context != null)
{
_context.Dispose ();
}
}
public JobRepository (IContext context)
{
_context = context;
}
}
Затем, как вы его используете, зависит от вашей конкретной задачи.Я не фанат этого прямого использования IRepository, но этот ответ становится слишком длинным.