Я думаю, что ваша реализация Unit of Work хороша, и она должна работать.
Здесь у вас есть другие возможные реализации:
// Interface used by upper layer
public interface IUnitOfWork : IDisposable
{
void Commit();
}
// EF dependent unit of work
public class EFUnitOfWork : IUnitOfWork
{
private readonly ObjectContext _context = new ObjectContext(...);
internal ObjectContext Context
{
get { return _context; }
}
...
}
// EF dependent repository - upper layer uses interface
public abstract class EFRepositoryBase<T> : IRepository<T> where T : class
{
private readonly ObjectContext _context;
private IObjectSet<T> _objectSet;
// yes unit of work and repository is tightly coupled because they both have
// to work with EF
public EFRepositoryBase(EFUnitOfWork unitOfWork)
{
_context = unitOfWork.Context;
}
...
}
Если вы помещаете единицы работы и реализации репозитория в отдельную сборку, этого должно быть достаточно.Работа с ObjectContext
будет внутренней реализацией сборки EF DAL, а верхние уровни не будут зависеть от EF и его сборок.
Это может быть улучшено путем введения DALFactory.Фабрика будет отвечать за создание и удаление ObjectContext
и создание unitOfWork и репозиториев.Это устранит тесную связь между UoW и репозиторием.
Я также использую эту реализацию, которая связывает UoW и абстрактную фабрику для репозиториев, но я немного изменил ее, так как написал этот ответ.Теперь моя реализация не имеет свойства для каждого хранилища.Вместо этого он использует универсальный метод, который возвращает хранилище для запрошенного типа объекта.Репозитории хранятся внутри словаря.Но эта реализация не очень чистая UoW.
Другая популярная реализация:
// Interface used by upper layer
public interface IUnitOfWork : IDisposable
{
void SaveChanges();
}
public class UnitOfWork : ObjectContext, IUnitOfWork
{
}