这个类结构方法是不是正确/可取? (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 是不是将我引向了正确的方向?