C# OO设计建议-需求已经改变,那么如何重构当前的类呢?

C# OO设计建议-需求已经改变,那么如何重构当前的类呢?,c#,oop,design-patterns,mvvm,C#,Oop,Design Patterns,Mvvm,最近提出了一项新要求,我想知道会推荐什么 我当前的设计有点像这样: 表示层:视图模型 服务层:WCF(从ORM类生成的类) 服务器模型层:ORM从DB生成的类 数据存储:关系数据库 一切正常,但现在我必须实现一个功能,我想知道我是否必须重新设计。下面是一个场景:我有一个Employee表,ORM生成到Employee类中,该表作为另一个Employee类映射到客户端层(模型),该类利用WCF通过EmployeeViewModel发送回服务器(它从该实体(Employee)的服务加载数据)以及其他

最近提出了一项新要求,我想知道会推荐什么

我当前的设计有点像这样: 表示层:视图模型 服务层:WCF(从ORM类生成的类) 服务器模型层:ORM从DB生成的类 数据存储:关系数据库

一切正常,但现在我必须实现一个功能,我想知道我是否必须重新设计。下面是一个场景:我有一个Employee表,ORM生成到Employee类中,该表作为另一个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。在DB中,名字和姓氏不可为空,地址可为空。因此类遵循这种DB设计,因此地址/地址属性的类型为Nullable(string?),但正如您从我的客户机模型中看到的,我用[Required]注释修饰了地址属性,这似乎满足了要求

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

理想情况下,我希望使用所有相同的类,但不确定如何将此新需求合并到上述框架中。我是否必须在ORM级别创建一个新的Employee类,该类继承自Employee基类型,例如EmployeeWithAddress,然后让该新类通过我的服务和ViewModel进行遍历?或者创建新的视图模型和视图


任何建议都会有帮助。

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


这是一个我在MVC3项目中使用过的类似功能。

谢谢你的提示,但我不相信这是我想要的。我看不出这个属性对我有什么帮助,也许只是看不到而已。你可以创建一个属性,比如“Required”就是“RequiredIf”。因此,在您的情况下,您有一个下拉列表来确定是否需要您的地址。假设您将该下拉值存储在名为Country的属性中。如果国家/地区值为“美国”,则需要地址。您的地址财产的装饰人应为[RequiredIf(“国家”,“美国”,ErrorMessage=“如果居住在美国,地址是必需的”]