在C#MVC应用程序中,我有一个Model,Customer,可以从数据库中检索,也可以创建为新的。
如果我正在创建新客户,那么设置默认值的正确方法是什么(例如CusotmerLevel默认为1)?
我是否应该为新员工和从数据库检索的员工或其他方式使用不同的构造函数?
答案 0 :(得分:23)
假设它是一个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 */
}
答案 1 :(得分:2)
使用默认构造函数,运行构造函数后我尝试设置的所有ORM都不应该干扰。
另一种方法是:
var customer = new Customer() { CustomerLevel=1 };
答案 2 :(得分:2)
您可以使用Factory
模式创建新客户。这样,您可以为Factory提供设置正确默认值的责任。
如果不可用,我会在默认构造函数中设置它。
答案 3 :(得分:2)
在构造函数中没问题,你可以在构造函数中将默认值也作为参数给出,如上所述。
但是,如果你使用可以为空的值,我发现这对于到目前为止的模型优先数据库工作非常有用,你也可以使用它:
private int? workWeekInHours;
public int? WorkWeekInHours
{
get { return workWeekInHours ?? 40; }
set { workWeekInHours = value; }
}
除非不存在数据库值,否则应始终提供数据库值。但是一旦新对象持久化到数据库,它就应该具有数据库中的默认值。
答案 4 :(得分:1)
你应该有一个用于创建新视图的视图模型
所以你可以这样做:
public ActionResult Create()
{
return View(new CustomerInput{ CustomerLevel = 1});
}
答案 5 :(得分:1)