在MVC架构中保留业务逻辑的位置?

时间:2013-10-11 15:42:29

标签: c# asp.net-mvc business-logic-layer

在我的公司,我们最近开始开发MVC应用程序。我们的任务是编写业务逻辑层,将来应该减少维护。

我们有几个网站服务来添加/更新/删除用户信息。

现在我们必须添加以下业务逻辑:

如果页面上的Field1是'xxxx',则field2应该在1000到2000的范围内 如果field3是某个部门,那么field4应该只在某些子部门中。

因此我们必须设计图层,以便将来我们的管理员(没有编程知识)可以进入并更改逻辑,以便它可以工作。请给我一些建议。

到目前为止,我得到的是:在模型中写下所有这些条件,并在用户点击保存按钮时验证它们。

提前致谢。

6 个答案:

答案 0 :(得分:3)

业务逻辑应该保留在模型中。你的目标应该是拥有一个大型模型和一个小型控制器。

您可能会发现阅读this很有意思。

同时检查 Where does the “business logic layer” fit in to an MVC application?

答案 1 :(得分:1)

将它保存在一个不知道你的ui层的单独程序集中。您的模型可以到此处并执行业务规则。我个人喜欢在Csla框架之上构建业务层,这使您可以构建具有强大规则的丰富模型。它面向更小的开发,但我相信它也与ddd兼容。

答案 2 :(得分:1)

我喜欢使用Entity Framework和Fluent Validation来创建包含模型和验证器的域层。设置如下:

public abstract class DomainEntity
{
    private IValidator validator;

    protected DomainEntity(IValidator validator)
    {
        this.validator = validator;
    }

    public bool IsValid
    {
        get { return validator.IsValid; }
    }

    public ValidationResult Validate()
    {
        return validator.Validate();
    }
}

public class Person : DomainEntity
{
    public int Id { get; set; }
    public string Name { get; set; }

    public Person() : base(new PersonValidator())
}

public class PersonValidator() : AbstractValidator<Person>
{
    public PersonValidator()
    {
         ... validation logic
    }
}

使用这个设置,我的模型和验证器生活在同一层,但我没有使用业务逻辑混淆我的模型类。

答案 3 :(得分:1)

当您谈论layering时,您的 业务层 应与 表示层分开 >。 ASP.NET MVC是一种表示技术;所以,您的业务层将处于不同的程序集中。此外,您的商业模式不会直接在您的观看中使用;您可以使用ViewModel验证用户输入,当一切正常时,将ViewModel数据传输到Business Entity。

如果您有兴趣获取有关企业级应用程序中分层的更多信息,我建议您Microsoft Spain - Domain Oriented N-Layered .NET 4.0 Sample App

答案 4 :(得分:0)

您可以使用DataAnnotations来执行此操作 - 实际上,数据注释不仅可以实现服务器端对模型有效性的强制执行。他们还可以提供实体框架和客户端脚本的提示,以便进行数据库/客户端验证,并向MVC可以检查的方法和属性添加元数据

e.g。对于模型:

class PersonDetailsModel
{
    [Required("Please enter a name")] // Don't allow no value, show the message when the rule is broken (if client side validation is enabled it shows when you tab off the control)
    [DisplayName("Full Name")] // Hint for MVC - show this when using the helper methods e.g. in MVC4 Razor syntax @Html.LabelFor(model => model.Name)
    public string Name { get; set; }
}

是的,在业务层(模型)中保留尽可能多的业务逻辑。除了交叉问题之外,您的组件应尽可能松散耦合。通过这种方式,可以进行更改的中心位置,您的代码更易于测试和维护,并且还可以帮助您保持编程的一致性(这有助于您的项目新手快速上手)

如果您有更复杂的规则,可以编写EF验证器。

http://msdn.microsoft.com/en-gb/data/gg193959.aspx

如果您没有使用Entity Framework,那么您可能需要考虑它 - 如果您使用的是另一个ORM,那么显然可以使用支持它的工具。如果您没有使用ORM,那么有其他选择,但您必须编写一些管道代码

答案 5 :(得分:0)

业务逻辑应该在模型层,我不认为没有编程知识的人可以改变业务逻辑,他必须至少具备基本的编程知识