我已經閱讀了很多關於存儲庫模式實現的知識,我仍然無法找到如何實現實體預測查詢?另一個存儲庫模式問題:如何處理域模型預測?
例如我有大而複雜的產品實體,但我只想顯示產品的名稱和它的ID。 我應該在哪裏實施這個預測?在我的實體存儲庫或調用者代碼?
我已經閱讀了很多關於存儲庫模式實現的知識,我仍然無法找到如何實現實體預測查詢?另一個存儲庫模式問題:如何處理域模型預測?
例如我有大而複雜的產品實體,但我只想顯示產品的名稱和它的ID。 我應該在哪裏實施這個預測?在我的實體存儲庫或調用者代碼?
我在存儲庫中執行此操作。
例如,我ProductRepository接口應該是這樣的:
interface IProductRepository
{
Product Get(int productId);
void Save(Product product);
ProductView FindProducts(string productNameSearch);
}
凡ProductView
是Product
簡化表示。 (例如只包含名稱和ID)。
獲得ProductView的投影是必須抽象出來的東西,而存儲庫是它的好地方,imho。
我一直夢想着最近以下模式:
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();
}
}
免責聲明:謹防錯誤或不良作風在上面的代碼。甚至可能不會編譯。這只是我的頭。但我認爲這個想法應該很清楚。
有什麼想法?
但你不打破存儲庫模式這種方式,因爲這種模式旨在提供給實體集合,如訪問,而不是實體的看法? – 2010-02-23 10:26:29