OO设计建议 - 要求已经改变,以便如何重构当前的类?

时间:2011-10-26 20:30:20

标签: c# oop design-patterns mvvm

最近提出了一项新要求,我想知道会有什么建议。

我目前的设计看起来有点像这样: 表示层:View-ViewModel-Model 服务层:WCF(从ORM类生成的类) 服务器模型层:来自DB的ORM生成的类 数据存储:关系数据库

一切正常但现在我必须实现一项功能,我想知道是否必须重做我的设计。这是场景:我有一个ORM生成到Employee类的Employee表,后者又被映射到客户端层(Model)作为另一个Employee类,它利用WCF通过EmployeeViewModel发送回服务器(它从该实体(Employee)的服务加载数据,并通过其他类的集合加载其他相关数据(如下拉列表),此EmployeeViewModel又绑定到EmployeeView。

我的员工类是典型的,例如

public partial class Employee: ViewEntity
{
    // other properties e.g. FirstName, etc.
    [Required]
    public string? Address
    {
        get 
        { 
            return ADDRESS; 
        }
        set
        {
            Validate(value, "Address");
            ADDRESS = value;
            OnPropertyChanged("Address");
        }
    }

    // Other methods...
    public static Employee CreateEmployee(IService service, string firstName, string lastName, string? address)
    {
        var emp = new Employee()
        {
            FIRST_NAME = firstName,
            LAST_NAME = lastName,
            ADDRESS = address
        };
        service.Create(emp);
        return emp;
    }
}

最初的要求是当用户在表单(EmployeeView)中输入数据时,唯一必需的字段是FirstName,LastName和Address。在数据库中,FIRST_NAME和LAST_NAME不可用,并且ADDRESS为NULLABLE。这些类遵循这个DB设计,因此Address / ADDRESS属性的类型为Nullable(字符串?),但是从我的客户端模型中可以看出,我用[Required]注释装饰了Address属性,这似乎就足够了要求。

但是现在,我有一个新的要求,用户可以从下拉列表中选择两个值中的一个,并根据他们选择的值,地址是强制性的还是非强制性的。

理想情况下,我想使用所有相同的类,但不确定如何将此新要求合并到上述框架中。我是否必须在ORM级别创建一个继承自Employee基类型的新Employee类,例如EmployeeWithAddress,然后让我的新类通过我的Service和ViewModel流淌?或者也许创建新的ViewModel和Views?

任何建议都会有所帮助。

1 个答案:

答案 0 :(得分:0)

我不确定MVC和WCF之间的验证有何不同,但您可以考虑创建自定义验证器。 MVC使用System.ComponentModel.DataAnnotations进行验证。如果这适用于WCF,您可以尝试。

这是article我曾经在我的MVC3项目中获得类似的功能。