C# MVC架构中的业务逻辑保存在哪里?

C# MVC架构中的业务逻辑保存在哪里?,c#,asp.net-mvc,business-logic-layer,C#,Asp.net Mvc,Business Logic Layer,在我的公司,我们最近开始开发MVC应用程序。我们的任务是编写业务逻辑层,将来它应该少维护 我们有两个web服务来添加/更新/删除用户信息 现在我们必须添加如下业务逻辑: 如果页面上的字段1为“xxxx”,则字段2应在1000到2000之间 如果field3是某个部门,那么field4应该只在某些子部门中 因此,我们必须设计该层,以便将来我们的管理员(不具备编程知识的管理员)能够进入并更改逻辑,从而使其工作。请给我一些建议 到目前为止,我得到的是:在模型中写入所有这些条件,并在用户单击save按钮

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

我们有两个web服务来添加/更新/删除用户信息

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

如果页面上的字段1为“xxxx”,则字段2应在1000到2000之间 如果field3是某个部门,那么field4应该只在某些子部门中

因此,我们必须设计该层,以便将来我们的管理员(不具备编程知识的管理员)能够进入并更改逻辑,从而使其工作。请给我一些建议

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


提前感谢。

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

你会发现这本书读起来很有趣


同时检查业务逻辑是否应保存在模型中。你的目标应该是有一个大模型和一个小控制器

你会发现这本书读起来很有趣


同时选中

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

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

您可以使用
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验证器


如果您不使用实体框架,那么您可能需要考虑它——如果您使用另一个ORM,那么显然使用支持该ORM的工具。如果您不使用ORM,那么还有其他选择,但您必须编写一些管道代码,您可以使用

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验证器


如果您不使用实体框架,那么您可能需要考虑它——如果您使用另一个ORM,那么显然使用支持该ORM的工具。如果您不使用ORM,那么还有其他选择,但您必须编写一些管道代码,业务逻辑应该在模型层,我不认为任何没有编程知识的人都可以更改业务逻辑,他必须具备基本的编程知识,至少业务逻辑应该在模型层,我不认为没有编程知识的人可以改变业务逻辑,他必须至少有基本的编程知识

我喜欢使用实体框架和流畅的验证来创建一个包含模型和验证程序的域层。设置如下所示:

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
    }
}
公共抽象类DomainEntity
{
专用IValidator验证器;
受保护的域实体(IValidator验证程序)
{
this.validator=验证程序;
}
公共布尔是有效的
{
获取{return validator.IsValid;}
}
公共验证结果验证()
{
返回validator.Validate();
}
}
公共类人员:DomainEntity
{
公共int Id{get;set;}
公共字符串名称{get;set;}
public Person():base(新PersonValidator())
}
公共类PersonValidator():AbstractValidator
{
公共PersonValidator()
{
…验证逻辑
}
}

使用此设置,我的模型和验证器位于同一层,但我不会用业务逻辑混淆我的模型类。

我喜欢使用实体框架和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
    }
}
公共抽象类DomainEntity
{
专用IValidator验证器;
受保护的域实体(IValidator验证程序)
{
this.validator=验证程序;
}
公共布尔是有效的
{
获取{return validator.IsValid;}
}
公共验证结果验证()
{
返回validator.Validate();
}
}
公共类人员:DomainEntity
{
公共int Id{get;set;}
公共字符串名称{get;set;}
public Person():base(新PersonValidator())
}
公共图书馆