我正在学习MVC 3,我没有发现人们在数据模型类的属性中使用某些逻辑代码。
他们按照以下方式执行数据模型类(例如):
public class Customer
{
public int CustomerId {get;set;}
//other properties without any logic code.
}
可以在属性中包含逻辑代码,如下所示吗?
public class Customer
{
private int customerId;
public int CustomerId {
get{return customerId;}
set
{
customerId=value;
// some logic codes go here.
}
}
//other properties go here.
}
这是我真实的情景:
子表数据模型:
namespace MvcApplication1.Models
{
public class Choice
{
public int ChoiceId { get; set; }
public string Description { get; set; }
public bool IsCorrect { get; set; }
public QuizItem QuizItem { get; set; }
}
}
父表数据模型:
namespace MvcApplication1.Models
{
public class QuizItem
{
public int QuizItemId { get; set; }
public string Question { get; set; }
private IEnumerable<Choice> choices;
public IEnumerable<Choice> Choices
{
get { return choices; }
set
{
choices = value;
foreach (var x in choices)
x.QuizItem = this;
}
}
}
}
消费者:
namespace MvcApplication1.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
var data = new List<QuizItem>{
new QuizItem
{
QuizItemId = 1,
Question = "What color is your hair?",
Choices = new Choice[]{
new Choice{ ChoiceId=1, Description="Black.", IsCorrect=true},
new Choice{ ChoiceId=2, Description="Red.", IsCorrect=false},
new Choice{ ChoiceId=3, Description="Yellow.", IsCorrect=false}
}
},
new QuizItem
{
QuizItemId = 2,
Question = "What color is your noze?",
Choices = new Choice[]{
new Choice{ChoiceId=1, Description="Pink.", IsCorrect=false},
new Choice{ChoiceId=2, Description="Maroon.", IsCorrect=true},
new Choice{ChoiceId=3, Description="Navy Blue.", IsCorrect=false}
}
}
};
return View(data);
}
}
}
答案 0 :(得分:2)
这需要一种方法。原因有两个:
我建议遵循:
public class QuizItem
{
public int QuizItemId { get; set; }
public string Question { get; set; }
private IEnumerable<Choice> choices;
public IEnumerable<Choice> Choices
{
get { return choices; }
}
public void SetChoices(IEnumerable<Choice> choices)
{
foreach (var x in choices)
x.QuizItem = this;
this.choices = choices;
}
}
答案 1 :(得分:0)
我认为你应该在控制器中实现这个逻辑。但是我总是在我的模型中定义POCO类,并使用ViewModel来实现这样简单的逻辑。
答案 2 :(得分:0)
这更像是一种哲学方法。因此,这取决于辩论。
到目前为止,最普遍的方法是使用严格的分层关注方法,其中“模型”对象仅负责包含数据,如果要在其上应用任何类型的业务逻辑,则需要在单独的“业务逻辑”层上实现它,该层处理诸如数据完整性的验证/可靠性,根据业务流程的数据突变等问题的应用。
另一种方法是使用模型层实际模型(如动词中)目标域的业务。在这种情况下,模型充当业务规则的直接定义,并且应该像业务规则一样丰富。 (这种方法已被Naked Objects采用极端,它基本上保留了模型中的数据结构和业务逻辑,并从同一模型生成ORM,控制器逻辑和视图)
一般来说,“你的模型对象应该多么聪明/应该是我的模型对象”的问题是从你使用的框架中提出的问题。有些框架根本不关心任何一种方式(ASP.NET MVC),其他人希望您永远不要担心编码这些东西,只要您提供足够的元数据以便他们可以为您完成工作(NHibernate,Entity Framework)。其他人鼓励您在域对象模型中表达所有业务规则和逻辑(例如Naked Objects)
答案 3 :(得分:0)
我认为,数据模型应该执行与数据(值)相关的逻辑,如“此值是否对...有效”。同样,在执行隐藏逻辑(例如在这种情况下“附加父对象”)时,将方法命名为“ set”也是错误的。