【发布时间】:2011-04-20 02:00:55
【问题描述】:
我正在开发我的第一个真正的 MVC 应用程序,并且我正在尝试遵循一般的 OOP 最佳实践。我正在将控制器中的一些简单业务逻辑重构到我的域模型中。我最近一直在做一些阅读,似乎很清楚我应该将逻辑放在域模型实体类中的某个位置,以避免“贫血域模型”反模式。
该应用程序将允许人们购买停车位的租约。价格取决于景点的长度以及客户是否是商业园的成员。
所以我的域模型中有实体类,看起来像这样(简化):
public class Customer
{
int ID { get; set; }
string Name { get; set; }
bool IsMember { get; set; }
}
public class ParkingSpace
{
int ID { get; set; }
int Length { get; set; }
}
public class ParkingSpaceLease
{
int ID { get; set; }
DateTime OpenDate { get; set; }
DateTime CloseDate { get; set; }
Customer Customer { get; set; }
ParkingSpace ParkingSpace { get; set; }
}
编辑:只是为了澄清 LeaseQuote 不是实体类,因为它只是用于向潜在客户显示成本明细,并且不会在任何地方保留。
public class LeaseQuote
{
int SubTotal { get; set; }
int Discount { get; set; }
int Total { get; set; }
}
现在,作为应用程序的一项功能,我需要能够为不同的客户和停车位组合生成报价。报价通常会在实际创建租约的环境之外访问,例如当客户致电询问价格时。
那么最好的方法是什么?在控制器内实例化一个新的 ParkingSpaceLease 对象是否有意义只是 以在其上调用 GetQuote 方法?
var lease = new ParkingSpaceLease();
var quote = lease.GetQuote(length: 168, isMember: true);
return Json(quote);
或者 LeaseQuote 类应该有方法吗?
var leaseQuote = new LeaseQuote();
var quote = leaseQuote.GetQuote(length: 168, isMember: true);
return Json(quote);
将逻辑放在实际的 ParkingSpaceLease 类中感觉很奇怪。我想创建一个新的租约对象感觉有点“沉重”,因为我知道除了访问看起来有点像单独服务的 GetQuote 方法之外,我实际上不会对它做任何事情。
那么 GetQuote 方法应该去哪里,为什么它应该去那里?
【问题讨论】:
标签: c# asp.net-mvc oop