2011-05-24 103 views
0

我負責支持使用BusinessObjects(不包含邏輯,僅屬性)的C#Winforms應用程序和具有操作這些實體的類('Helpers')的BusinessLayer。C#:將BusinessObject傳遞給'BusinessLayer'構造函數或其方法?

問題: 如果您在BusinessObject的傳遞給助手構造函數,然後在構造函數中,初始化助手的公開訪問的實體變量 OR 如果你只是傳遞實體到它行動的方法呢?

方案1:若要將構造

Car myCar = new Car(); 
CarHelper ch = new CarHelper(myCar); 
ch.Wash(suds); 
ch.Upgrade(upgradeKit); 
ch.Save(); 

場景2:要的是對實體

Car myCar = new Car(); 
CarHelper ch = new CarHelper(); 
ch.Wash(myCar, suds); 
ch.Upgrade(myCar, upgradeKit); 
ch.Save(myCar); 

兩個主要問題,我有方案1行動的方法: A)的下一個開發人員必須挖掘CarHelper類來認識到它具有公共汽車訪問器屬性,並在需要它的方法中引用它。這進一步混淆了Helper類,因爲每個方法在執行其職責之前需要檢查'null'Car屬性... B)如果在操作之間存在一堆其他代碼,可能會變得不清楚ch.Wash ()實際上在做......它甚至對Car對象作用...?

大家怎麼想?

回答

0

是否有任何理由爲什麼你不能邏輯移動到BusinessObject的

Car myCar = new Car(); 
myCar.Wash(suds); 
myCar.Upgrade(upgradeKit); 
myCar.Save(); 

破除助手類完全。使讀更多的語義,並且不需要檢查空值。

一半的課程,以保持和

0

這是非常真實的...在BusinessObject的結束了邏輯,使其自我意識在我看來是最好的太...我不認爲一個選項,因爲:

在「應用程序」中,BusinessObjects位於由DAO引用的名稱空間(.... ApplicationServices)中,因此它實際上不能調用DAO方法(因爲它會導致一個循環依賴性) - 因此它不能實現以下功能:

myCar.Wash(suds) 
{ 
    this.CleanlinessRating = suds.CleaningAbilityRating;  
    // persist the level of Cleanliness to the DB 
    CarDAO.Save(this); 
} 

似乎整個應用程序背後的前提是BusinessObjects根本不實現任何邏輯......它們只是信息的容器,並沒有任何行爲。

然後,你必須作用於實體BusinessLayer類...

然後你有堅持的的entites到DB的變化數據層類。

顯然,讓實體自我感知和實現自己的行爲是一個很大的'不'(在這個應用程序中)......我相信這是真正的問題在這裏。

但是,假設我不能改變這種情況,你會怎麼做?

  1. 將實體傳遞給作用於其上的方法? 或
  2. 將實體包裝到Helper類的構造函數中?
0

怎麼樣讓你的CarHelper類擴展汽車

CarHelper helper = new Car(); 
helper.Wash(suds); 
helper.Upgrade(upgradeKit); 
helper.Save(); 

兩全其美

相關問題