2010-02-23 3 views

답변

0

나는 이것을 저장소에서한다.

예를 들어, 내 ProductRepository 인터페이스는 다음과 같이 보일 것이다 :

ProductViewProduct의 단순화 된 표현이다
interface IProductRepository 
{ 
    Product Get(int productId); 

    void Save(Product product); 

    ProductView FindProducts(string productNameSearch); 
} 

. (예를 들어 이름과 ID 만 포함).

ProductView를 얻기위한 투영은 추상화되어야하는 것이므로 리포지토리는 imho에게 좋은 장소입니다. 나는 최근에 다음과 같은 패턴까지 꿈꿔 왔던

+2

그러나이 패턴은 엔터티 컬렉션과 같은 액세스를 제공하기위한 것입니다 당신이, 저장소 패턴이 방법을 아프게하지 않는,하지 엔티티 전망? –

0

:이 패턴에서

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

P .: 실제 프로젝트에서 스펙을 가진 일반 파인더를 사용하는 것을 선호하지만, 저의 개념을 완벽하게 구현하는 것은 너무 혼란 스럽습니다. – chris

+0

P.P.S : 물론 C# 전용 솔루션이라는 것을 알고 있습니다. Java에서 일급 함수 등의 개념을 직접 지원하지 않기 때문에 지나치게 번거롭지 않으면 서 동등한 것이 가능할 지 모르겠습니다. – chris