IUnitOfWork как использовать - лучшая практика - PullRequest
4 голосов
/ 28 марта 2012

Я использую EF4.3.1 в приложении веб-форм .Net4.0 (не MVC!).

Я склонен использовать шаблон репозитория с интерфейсом IUnitOfWork.Но мне интересно, следую ли я лучшим рекомендациям, тем более что большинство примеров, которым я следовал, основаны на приложениях MVC.

Я скажу, что это всего лишь небольшое веб-приложение, так что это может повлиять на выбор решения..

В настоящее время решение имеет 3 проекта: модель, логика и сайт.Модель содержит объекты codefirst и интерфейс IUnitOfWork.Логика содержит репозитории и сервисный слой.Сайт, очевидно, содержит веб-сайт, код и т. Д.

Я не использую стороннюю утилиту для инъекций (ninject и т. Д.).Я вручную внедряю репозитории с помощью IUnitOfWork, т. Е.

общедоступный BookingRepository (IUnitOfWork unitOfWork)

Я не совсем ясно, что делать со служебными слоями, если IUnitOfWork также присутствует в проекте Site, илисуществуют только в слоях логики и модели.

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

общедоступный BookingService (IUnitOfWork unitOfWork, IBookingRepository репозиторий, IAppSettings appSettings)

Но это означает, что фиксация (сохранение в db) выполняется на уровне сайта, но мне интересно, следует ли это делать на уровне сервиса.Это также означает, что, поскольку мой IUnitOfWork объявлен на уровне модели, мне также нужна ссылка на модель на моем сайте.

Что я могу сделать лучше?Я что-то делаю правильно?лол

1 Ответ

4 голосов
/ 16 ноября 2013

Дмитрий прав.Вот пример реализации Единицы работы.Преимущество здесь в том, что шаблон единицы работы координирует работу нескольких репозиториев, применяя один класс контекста базы данных, общий для всех из них.

Это хороший ресурс для начала, чтобы понять, как эти шаблоны могут бытьиспользуется вместе.Он действителен как для разработки MVC, так и для разработки веб-форм. Реализация шаблонов репозитория и единиц работы в приложении ASP.NET MVC

public class UnitOfWork : IDisposable
{
    private DbContext _context;
    private PersonRepository _personRepository;
    private CompanyRepository _companyRepository;

    public UnitOfWork(DbContext context)
    {
        this._context = context;
    }

    public void Commit()
    {
        _context.SaveChanges();
    }

    // We lazy-load our repositories...
    public PersonRepository PersonRepository 
    {
        get
        {
            if (this._personRepository == null)
            {
                this._personRepository = new PersonRepository(context);
            }
            return _personRepository;
        }
    }

    public CompanyRepository 
    {
        get
        {
            if (this._companyRepository == null)
            {
                this._companyRepository = new CompanyRepository(context);
            }
            return _companyRepository;
        }
    }

    //IDisposable implementation removed for brevity...
}
...