2010-01-19 50 views
5

所以我有一個DAO,DTO和BO。下面的代碼是結果:分離問題 - DAO,DTO和BO

// Instantiate a new user repository. 
UserRepository rep = new UserRepository(); 

// Retrieve user by ID (returns DTO) and convert to business object. 
User user = rep.GetById(32).ToBusiness<User>(); 

// Perform business logic. 
user.ResetPassword(); 
user.OtherBusinessLogic("test"); 
user.FirstName = "Bob"; 

// Convert business object back to a DTO to save to the database. 
rep.Save(user.ToDataTransfer<Data.DTO.User>()); 

所以我想分開的擔憂,但我想擺脫這個代碼中的「轉換」。 「轉換器」實際上位於業務邏輯層(DTO層不瞭解業務邏輯層)作爲擴展對象。 DTO本身顯然只存儲數據,並且沒有任何業務邏輯。 UserRepository調用DAO,並在GetById的末尾使用AutoMapper將DAO映射到DTO。 「轉換」(ToBusiness和ToDataTransfer)完全按照他們的說法進行。

我的一位同事認爲我可能必須擁有Business Repository,但認爲它可能有點笨拙。有什麼想法嗎?

回答

3

我解決了這個通過創建一個業務服務層:

如果所有的鑄造是在資源庫處理,並且讀取你的代碼,該代碼是乾淨多了。通過這種方式,我可以通過業務服務層訪問功能,而業務服務層則使用查詢DAL並返回DTO的存儲庫。 DTO通過由DAL填充並幫助將數據傳輸到業務層(轉換爲業務對象)來實現其目的。

所以圖如下:

DAL - >庫(返回DTO) - >服務(返回BO)

它非常好,我能夠把業務邏輯的服務層它從存儲庫本身抽象出它。示例代碼:

// UserService uses UserRepository internally + any additional business logic. 
var service = new UserService(); 
var user = service.GetById(32); 

user.ResetPassword(); 
user.OtherBusinessLogic("test"); 
user.FirstName = "Bob"; 

service.Save(user); 
1

這是第一次看到一個DTO被轉換成一個BO,我通常發送一個DTO到由BO類或方法被消耗。當BO完成並且想要將修改保存到DTO時,它將其發送到DAL並且保持它。

+0

感謝您的回覆。您可以提供的任何示例代碼都會有所幫助。 – 2010-01-19 20:57:07

+0

我同意這一點。您應該找回您的業務對象,如果您需要轉換爲DTO,那麼可以使用AutoMapper等工具進行轉換。 – 2010-01-19 21:48:55

8

我唯一的困惑來源是爲什麼要撥打ToBusiness<User>()ToDataTransfer<Data.DTO.User>()是必要的。

存儲庫的職責是處理數據管理。它應該隱藏實現細節(以及Business Objects和Data Objects之間的轉換)。

A UserRepository應該返回User而不需要任何鑄造。

UserRepository也應該能夠保持User不鑄造。

UserRepository rep = new UserRepository(); 

User user = rep.GetById(32); 

// Do Work Here 

rep.Save(user); 
+1

你建議沒有DTO對象並跳到業務對象的權限? 回覆:更清晰的代碼 - 我完全同意 - 這是我試圖使用這些問題的分離。 – 2010-01-19 20:56:38

+0

糾正我,如果我在這裏賈斯汀錯了,但我不認爲賈斯汀建議沒有DTO,而是建議隱藏它。存儲庫將調用DTO和BO之間的轉換方法,以便在您編寫正常的業務功能時,您永遠不必查看或瞭解DTO。 – rayd09 2010-01-23 18:03:35