我必須啓動一個項目,其中支持的數據庫是SQL Server,而且我使用.Net framework 3.5。Linq to SQL生成單獨的業務類或實體類
我決定將LINQ to SQL用於數據訪問層。我應該編寫單獨的類來用於業務層和表示層,或者我使用LINQ to SQL自動生成的實體類。
我必須啓動一個項目,其中支持的數據庫是SQL Server,而且我使用.Net framework 3.5。Linq to SQL生成單獨的業務類或實體類
我決定將LINQ to SQL用於數據訪問層。我應該編寫單獨的類來用於業務層和表示層,或者我使用LINQ to SQL自動生成的實體類。
我使用實體框架代碼第一次,但下面的概念是相同的(爲不平凡的項目):
我總是把我的DAL類從我實際的業務層。這樣可以減少數據庫更改對應用程序的影響。除了我的DAL項目以外,我從不使用DAL類。
我目前的項目採用DDD的,任何佈局類似於以下(大規模簡化):
MainApp
MainApp.Domain
|...IRepositories
|...AggregrateX
|...AggregrateY
MainApp.Dal
|...Models
|...Repositories
的DAL庫方法使AutoMapper的使用:
public Customer Get(int customerId)
{
using (var context = GetContext())
{
var entity = context.Customers.Where(x=>
x.CustomerId == customerId).Single();
return Mapper.Map<DtoCustomer, Customer>(entity);
}
}
public void Save(Customer customer)
{
using (var context = GetContext())
{
var entity = context.Customers.Where(x=>
x.CustomerId == customer.CustomerId).Single();
Mapper.Map(customer, entity);
context.SaveChanges();
}
}
從而允許我的業務類和我的實際DAL/DTO對象之間完全分離。理論上,它允許更改整個後端而不影響任何業務邏輯。我沒有展示的是,我還確保表示層從未看到域/業務對象,因爲我通過外觀映射到輸入/視圖模型並從中映射。
基本上,我剩下的是一個包含所有業務邏輯的領域層,這些業務邏輯不關心正在使用什麼,它如何填充或如何持久化,DAL層的唯一目的是人口和持久性我的領域/商業類。
但是,這對於大型項目來說纔有意義。我只會在瑣碎/小型項目上使用DAL類。
我可以告訴你我們做了什麼。我們正在將L2S用於我們的下一代製造應用。我們是一家2.5億美元的全球太陽能製造公司。我們有兩套實體。我們有我們的L2S實體,我們在我們的「後端」嚴格使用。然後,我們在我們的客戶端應用程序中使用一組更輕的應用程序/域實體,並將它們反覆傳遞到我們的後端。
在許多情況下,我們將使用視圖來模擬我們的域實體,然後將視圖作爲只讀表引入到我們的L2S模型中。這使我們能夠擁有'域'實體,並且我們能夠使用L2S來查詢相應的視圖以保護這些實體。
適合我們。
您的'客戶端應用程序'Web應用程序或智能客戶端,如Win Forms或Silverlight? – Steven 2010-12-07 13:10:14
@Steven - 我們都有三個。 Web應用程序,Win表單和一對Silverlight應用程序。 – 2010-12-07 13:11:32