2011-05-24 48 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(); 

两全其美