在 C# MVC 应用程序中,我有一个模型 Customer,它可以从数据库中检索或创建为新的。
如果我正在创建一个新客户,那么设置默认值的正确方法是什么(例如 CusotmerLevel 默认为 1)?
我应该为新员工和从数据库中检索到的员工使用不同的构造函数,还是以其他方式?
在 C# MVC 应用程序中,我有一个模型 Customer,它可以从数据库中检索或创建为新的。
如果我正在创建一个新客户,那么设置默认值的正确方法是什么(例如 CusotmerLevel 默认为 1)?
我应该为新员工和从数据库中检索到的员工使用不同的构造函数,还是以其他方式?
假设它是 POCO,我一直发现构造函数可以很好地建立默认值。我通常借此机会宣布诸如CreatedDate
. 从数据库中检索它时,公共属性将被数据库值覆盖。
public class Customer
{
public Int32 Id { get; set; }
public Int32 CustomerLevel { get; set; }
/* other properties */
public Customer()
{
this.CustomerLevel = 1;
}
}
而且,如果您使用的是 C# 6.0,请查看auto-property initializers:
public class Customer
{
public Int32 Id { get; set; } = 1;
public Int32 CustomerLevel { get; set; }
/* other properties */
}
使用默认构造函数,我尝试过的所有 ORM 在构造函数运行后设置值,因此它不应该干扰。
一种替代方法是:
var customer = new Customer() { CustomerLevel=1 };
您可以使用该Factory
模式来创建新客户。这样您就可以让工厂负责设置正确的默认值。
如果不可用,我会在默认构造函数中设置它。
在构造函数中很好,您也可以在构造函数中将默认值作为参数提供,如上所述。
但是,如果您使用可空值,我发现这对模型优先的数据库工作非常有帮助,您也可以使用它:
private int? workWeekInHours;
public int? WorkWeekInHours
{
get { return workWeekInHours ?? 40; }
set { workWeekInHours = value; }
}
这应该始终给出数据库值,除非不存在数据库值。但是一旦新对象被持久化到数据库中,从那时起它应该在数据库中具有默认值。
您应该有一个用于创建新视图的视图模型
所以你可以这样做:
public ActionResult Create()
{
return View(new CustomerInput{ CustomerLevel = 1});
}