Существует ли предложенный шаблон для использования LINQ между уровнями Model & DataAccess в многоуровневой архитектуре на основе DDD? - PullRequest
7 голосов
/ 10 августа 2011

Я читал удивительную книгу Тима Маккарти о DDD в .NET .В своем примере приложения, однако, его базовый доступ к данным использует SqlCE, и он вручную создает встроенный SQL.

Я играл с некоторыми шаблонами для использования Entity Framework, но я застрял на том, как именно отобразитьIRepository linq запрашивает базовый уровень доступа к данным.

У меня есть конкретная реализация хранилища под названием.

public EFCustomerRepository : IRepository<DomainEntities.Customer> 
{
    IEnumerable<DomainEntities.Customer> GetAll(
                     Expression<Func<DomainEntities.Customer, bool>> predicate)
    {
        //Code to access the EF Datacontext goes here...
    }
}

В моей модели EF я использую объекты POCO, но даже в этом случаебыть нативным отображением между моим объектом DomainEntity.Customer и моими объектами DataAccessLayer.Customer.

, поэтому я не могу просто передать Expression<Func<DomainEntities.Customer, bool>> predicate в качестве параметра для EFContext.Customers.Where(...);

способ нанести на карту Expression<Func<T, bool>> predicate => Expression<Func<TOTHER, bool>> predicate

Или я все это делаю неправильно?Любые предложения / указатели приветствуются.

Ответы [ 2 ]

3 голосов
/ 10 августа 2011

В таком случае вы должны реализовать свой собственный преобразователь одного дерева выражений в другое (возможно, более одного), которое будет полностью задействовать вашу логику отображения. Обычно ваше выражение на данный момент является просто спецификацией (шаблоном спецификации), и вы должны преобразовать эту спецификацию, чтобы сохранить выражение.

Btw. это неверно. Не должно быть отдельных объектов уровня доступа к данным - уровень доступа к данным должен загружать и сохранять объекты вашего домена напрямую, но EF не в состоянии полностью сделать это правильно, потому что его функциональные возможности отображения ограничены, и он выдвигает свои собственные требования к объектам. Вам следует проверить NHibernate или другие ORM, если вы хотите серьезно заниматься DDD (по книге).

2 голосов
/ 14 августа 2011

Из кода, приведенного в вашем примере, я полагаю, вы не используете универсальный шаблон репозитория?

Я использую EF CodeFirst (но он работает для старого EF) с общим шаблоном репозитория ... http://average -uffe.blogspot.com / 2011/03 / repository-pattern-with-ef-code -first.html

У меня нет Expression<Func<DomainEntities.Customer, bool>> в этом посте, но у меня всегда есть метод Find в интерфейсе IRepository<T>.

Интерфейс:

IEnumerable<T> Find(Expression<Func<T, bool>> expression, int maxHits = 100);

И реализация в абстрактной базе репозитариев:

public virtual IEnumerable<T> Find(Expression<Func<T, bool>> expression, int maxHits = 100) {
    return this.DataContext.DbSet<T>().Where(expression).Take(maxHits);
}

И теперь вы можете вызывать Find для любой сущности с помощью лямбда-выражения ...

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

...