IUnitOfWork как да използвате - най-добра практика

Използвам EF4.3.1 в приложение за уеб формуляри .Net4.0 (не MVC!).

Склонен съм да използвам модела на хранилището с интерфейс IUnitOfWork. Но се чудя дали следвам най-добрите практики, особено след като повечето примери, които съм следвал, са базирани на MVC приложения.

Ще кажа, че това е само малко уеб приложение, така че това може да повлияе на избора на решение.

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

Не използвам помощна програма за инжектиране на трети страни (ninject и т.н.). Ръчно инжектирам хранилища с IUnitOfWork, т.е.

публичен BookingRepository(IUnitOfWork unitOfWork)

По-малко ми е ясно какво да правя със слоевете услуги, трябва ли IUnitOfWork също да съществува в проекта на сайта или да съществува само в слоевете Logic и Model.

В момента инжектирам хранилище и единица работа в услуга, т.е.

публичен BookingService(IUnitOfWork unitOfWork, IBookingRepository хранилище, IAppSettings appSettings)

Но това означава, че ангажирането (запазване в db) се извършва на ниво сайт, но се чудя дали трябва да се извършва в слоя на услугата. Това също означава, че тъй като моят IUnitOfWork е деклариран в моя модел слой, имам нужда от препратка към модела и в моя сайт.

Какво мога да направя по-добре? Правя ли нещо правилно? хаха


person raydenl    schedule 27.03.2012    source източник
comment
IUnitOfWork не трябва да се предава в хранилище, а само в услуга. Вижте пример тук stackoverflow.com/questions/ 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