IUnitOfWork как использовать - лучшая практика

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

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

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

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

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

общедоступный репозиторий резервирования (IUnitOfWork unitOfWork)

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

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

public BookingService (IUnitOfWork unitOfWork, репозиторий IBookingRepository, IAppSettings appSettings)

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

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


person raydenl    schedule 27.03.2012    source источник
comment
IUnitOfWork нельзя передавать в репозиторий, только в сервис. Пример см. здесь 9808577/   -  person Dmitriy Startsev    schedule 29.03.2012


Ответы (1)


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

Это хороший ресурс для начала понимания того, как эти шаблоны можно использовать вместе. Он действителен как для 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...
}
person Ben Ripley    schedule 16.11.2013