Шаблон репозитория + UnitOfWork для структуры сущностей - PullRequest
8 голосов
/ 17 мая 2011

Я искал сеть вверх и вниз, и мне не удалось найти подходящий дизайн для моего приложения.
Я ищу шаблон Repository + UnitOfWork, который будет управлять соединениями и автоматически распоряжаться ими после завершения.

Мне нужно поддерживать как веб-приложение, где каждый запрос будет иметь свое собственное UnitOfWork, так и приложение Windows, где каждый поток будет иметь свой собственный UnitOfWork.Мне нужны скороговорки для автоматического размещения UnitOfWork, когда запрос / поток завершен.Я также хотел бы поддержать откат в случае исключения.

Сейчас я использую StructureMap, поэтому я не хочу продолжать использовать его в предлагаемых ответах.

Причина, по которой мне нужен шаблон репозиторияэто достичь всех способностей, которые мне нужны для всех моих сущностей.Причина, по которой мне нужен UnitOfWork, заключается в том, чтобы разрешить изменения более чем в одном объекте.

Я действительно буду признателен за любую помощь.

Спасибо.

Ответы [ 4 ]

3 голосов
/ 18 мая 2011

Я использовал этот блог в качестве действительно хорошей отправной точки:

http://www.primaryobjects.com/CMS/Article122.aspx

Он начинается в ОЧЕНЬ начале и предоставляет исходный код в конце для вас.Он также использует StructureMap, поэтому он может быть вам знаком.

1 голос
/ 18 мая 2011

В прошлом году я написал статью о написании репозиториев с поддержкой LINQ, которые легко подделать для модульного тестирования и которые хорошо работают с внедрением зависимостей. Вот статья .Вкратце, в статье описывается единица работы, которая имитирует LINQ to SQL DataContext и включает в себя интерфейс IDataMapper, который абстрагирует реальный инструмент O / RM.Единица работы содержит свойства типа Repository<TEntity>, такие как Repository<Customer> или Repository<Order>, а класс репозитория реализует IQueryable<T>, что позволяет вам LINQ поверх него.

IDataMapper является простыминтерфейс, который выглядит следующим образом:

public interface IDataMapper : IDisposable
{
    Repository<T> GetRepository<T>() where T : class;

    void Save();
}

Решение, описанное в статье, разработано так, чтобы оно было дружественным к модульному тестированию и DI.Фактически, единственная конфигурация, которая вам нужна, это следующая:

string northwindConnection = GetConStr("Northwind");

container.RegisterSingle<IUnitOfWorkFactory<NorthwindUnitOfWork>>(
    new LinqToSqlNorthwindUnitOfWorkFactory(northwindConnection));

container.RegisterSingle<IUnitOfWorkFactory<SalesUnitOfWork>>(
    new EntityFrameworkSalesUnitOfWorkFactory());
1 голос
/ 17 мая 2011

Я бы порекомендовал фреймворк NCommon. Вы можете найти блог об этом здесь: http://www.codeinsanity.com/

0 голосов
/ 18 мая 2011

Если у вас уже есть единица работы и репозитории, и вы используете StructureMap, так в чем же проблема?

Вы можете просто настроить свои классы как:

ObjectFactory.Configure(x => x.For<IUnitOfWork>()
                              .HybridHttpOrThreadLocalScoped()
                              .Use<EFUnitOfWork>());

И вы можете использовать внедрение зависимостей для передачи единицы работы в репозитории.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...