2010-02-23 54 views

回答

0

我在存儲庫中執行此操作。

例如,我ProductRepository接口應該是這樣的:

interface IProductRepository 
{ 
    Product Get(int productId); 

    void Save(Product product); 

    ProductView FindProducts(string productNameSearch); 
} 

ProductViewProduct簡化表示。 (例如只包含名稱和ID)。

獲得ProductView的投影是必須抽象出來的東西,而存儲庫是它的好地方,imho。

+2

但你不打破存儲庫模式這種方式,因爲這種模式旨在提供給實體集合,如訪問,而不是實體的看法? – 2010-02-23 10:26:29

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.S .:在現實世界的項目中,我更喜歡使用具有規格的通用發現器,但是我完全實現這個概念在這裏會太分散注意力。 – chris 2012-02-14 17:18:43

+0

P.P.S .:我當然知道這是一個C#特定的解決方案。我不知道Java中是否有相當的東西可以實現,而不會過於繁瑣,因爲它仍然不能直接支持一流功能的概念等。 – chris 2012-02-15 12:06:03