我正在开发我的第一个真正的MVC应用程序,并尝试遵循一般的OOP最佳实践。我正在将一些简单的业务逻辑从控制器中重构到我的领域模型中。最近我一直在阅读,似乎很清楚我应该将逻辑放在领域模型实体类中的某个地方,以避免“贫血的领域模型”反模式。
该应用程序将允许人们购买停车位租赁。费率由停车位长度和客户是否是商业园区会员决定。
因此,我的领域模型中有像这样的实体类(简化):
现在作为应用程序的一个功能,我需要能够针对不同的客户和停车位组合生成报价。通常情况下,报价将在实际创建租赁之外访问,例如当客户打电话询问价格时。
那么,最佳方法是什么?是否有意义在控制器内实例化一个新的ParkingSpaceLease对象,仅仅为了调用它的GetQuote方法?
或者LeaseQuote类应该有这个方法吗?
该应用程序将允许人们购买停车位租赁。费率由停车位长度和客户是否是商业园区会员决定。
因此,我的领域模型中有像这样的实体类(简化):
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方法应该放在哪里?为什么要放在那里?