这个类结构方法是不是正确/可取? (MVC/C#)

Posted

技术标签:

【中文标题】这个类结构方法是不是正确/可取? (MVC/C#)【英文标题】:Is this class structure method correct/desireblable? (MVC/C#)这个类结构方法是否正确/可取? (MVC/C#) 【发布时间】:2011-07-17 10:56:23 【问题描述】:

我正在构建一个 MVC 应用程序,它比我通常所做的要复杂一些,我想尝试一种新的类结构。基本上有很多阅读正在进行。只有 5-10% 的操作会针对数据库进行插入/更新。

因此,我正在考虑创建从数据库层返回的基本 DTO 类。然后,业务对象将从 DTO 类继承,以便使用所有验证和业务规则扩展基本结构。

例子:

namespace Project.DTO

    public class Employee
    
        public string Name;
        public string Surname;
        ...
    


namespace Project

    public class Employee : Project.DTO.Employee
    
        public bool IsValid()
        
        ...
        
    

这是一个好方法吗?我还没有想到的是如何在 MVC 中使用它们,因为“正确”的方法是实现模型类。我相信我也可以创建从 DTO 对象继承的模型类......但我不确定。

我还需要一种使用某种接口来处理所有验证功能的方法,以避免在 GUI 上重复太多通用代码。

提前致谢!

【问题讨论】:

【参考方案1】:

我可能会使用完全不同的方法。我的主要想法是:

我希望类之间的耦合更松散,因此我的模型类不会从我的 DTO 对象继承 我可能不会在我的模型类中包含验证逻辑

这将导致以下结构开始:

namespace Project.DTO

    public class Employee
    
        public string Name;
        public string Surname;
        ...
    


namespace Project

    public class Employee
    
        public string Name  get; set; 
        public string Surname  get; set; 
    

说到验证逻辑,我会为验证逻辑做一个接口,注入到Emplyee类中:

public interface IValidator<T>

    bool IsValid(T objectToInspect);

public class Employee

    private readonly IValidator<Employee> validator;
    public Employee(IValidator<Employee> validator)
    
        this.validator = validator;
    

    public string Name  get; set; 
    public string Surname  get; set; 

    public bool IsValid()
    
        return validator.IsValid(this);
    

这为您的设计打开了一整套功能,包括使用 IoC 容器和更好地支持测试。

【讨论】:

引人注意,我面临着类似的问题。你的回复对我帮助很大 界面选项是我过去做过的,效果很好。但是关于松散耦合,Business 类将至少具有 DTO 对象的相同属性,因此通过两次定义所有字段,我相信您正在走很长的路。 @DaniH:业务类不一定具有 DTO 的所有属性。对于某些用途,您很可能拥有具有较少属性的业务类,或者甚至可能是一个 DTO 拆分为多个不同业务类的情况。 我最终选择了这条路线。我最终创建了一个 EmployeeValidator 类来验证 Employee 对象。我觉得这个设置很舒服,因为验证部分是分开的,很好而且整洁。在 Employee 类中,我刚刚添加了一个调用验证器的 IsValid 类,其方式与 Fredrik 发布的非常相似。非常感谢您的帮助!!!【参考方案2】:

如果验证必须检查参数必须来自数据库的规则怎么办?您的实体将不具备访问该参数的知识和方法。

创建模型/视图模型很好,但验证通常需要更复杂的逻辑,这需要专门的类 - 所以我通常不会在我的实体上实现 IsValid

但是,您可以针对实体的简单属性使用 System.Component.DataAnnotation 验证属性。

【讨论】:

我想到的是,从 DTO 继承的 Employee 类是具有验证例程的类,如果需要,它将包括对 DB 的检查。关于 DataAnnotation,如果它们不在从 Controller 类继承的类中,它们会起作用吗?我也在评估为此使用部分类...

以上是关于这个类结构方法是不是正确/可取? (MVC/C#)的主要内容,如果未能解决你的问题,请参考以下文章

让这个代码在 main 方法中作为它自己的类独立存在是不是正确? [关闭]

成员引用基类型“类”不是结构或联合——Fixit 是不是将我引向了正确的方向?

选择类还是 <nav> 元素更可取? [关闭]

我是不是正确使用 ctypes 来对这个结构进行 python 化?

检查类是不是具有使用 PHPUnit 定义的常量的正确方法

如何正确使用 TcpClient ReadTimeout