在数据模型类的属性中包含一些逻辑代码是否可以?

时间:2011-02-07 10:58:08

标签: c# asp.net-mvc

我正在学习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.
}

编辑1:

这是我真实的情景:

子表数据模型:

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);
        }

    }
}

4 个答案:

答案 0 :(得分:2)

这需要一种方法。原因有两个:

  • 我不建议收集的setter
    • Property Usage Guidelines - 每次设置属性时为集合中的每个项设置属性都很昂贵,不应该属于属性。而是一种方法。
  • 在setter中的代码(在您的情况下),会产生足够的副作用来取消对财产的使用

我建议遵循:

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”也是错误的。

一个更复杂的数据模型的样本: https://docs.microsoft.com/en-us/aspnet/mvc/overview/getting-started/getting-started-with-ef-using-mvc/creating-a-more-complex-data-model-for-an-asp-net-mvc-application