Еще один вопрос с образцом репозитория: как работать с проекциями модели предметной области? - PullRequest
2 голосов
/ 23 февраля 2010

Я много читал о реализации шаблонов репозитория, и до сих пор не могу понять, как мне реализовать запросы к проекциям объектов?

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

Ответы [ 3 ]

0 голосов
/ 14 февраля 2012

Недавно я придумал следующий шаблон:

interface IRepository 
{
    Product FindByName(string name);
    ProjectionType FindByName<ProjectionType>(string name, 
        Expression<Func<Product, ProjectionType>> selector);
    // ...
}

С помощью этого шаблона вы можете, например, задавать проекции на лету с помощью выражений LINQ и анонимных классов, например:

var productView = repository.FindByName("foo", 
    p => new { p.SomeProperty, p.SomeOtherProperty } );

Который я считаю довольно опрятным.С NHibernate.Linq реализация может выглядеть так:

ProjectionType FindByName<ProjectionType>(string name, Expression<Func<Product, ProjectionType>> selector) 
{
    using(var session = this.sessionFactory.OpenSession()) {
        return session.Linq<Product>()
                      .Where(p => p.Name.Equals(name))
                      .Select(selector)
                      .SingleOrDefault();
    }
}

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Остерегайтесь ошибок или плохого стиля в приведенном выше коде.Может даже не скомпилировать.Это только от кончика моей головы.Но я думаю, что идея должна быть довольно ясной.

Есть мысли?

0 голосов
/ 30 октября 2013
0 голосов
/ 23 февраля 2010

Я делаю это в хранилище.

Например, мой интерфейс ProductRepository будет выглядеть так:

interface IProductRepository
{
    Product Get( int productId );

    void Save( Product product );

    ProductView FindProducts(string productNameSearch);
}

Где ProductView - это упрощенное представление Product. (Например, содержит только имя и идентификатор).

Прогноз получения ProductView - это то, что нужно абстрагировать, и репозиторий - хорошее место для него, imho.

...