Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在类中实现验证的最佳方法?_C#_Oop_Design Patterns - Fatal编程技术网

C# 在类中实现验证的最佳方法?

C# 在类中实现验证的最佳方法?,c#,oop,design-patterns,C#,Oop,Design Patterns,我的应用程序中有一个设计问题。 我有一个类,其中的字段具有某种业务逻辑验证。 该类以两种方式实例化和填充数据。。 1:由类的使用者:从前端发送并填充到对象中并保存在数据库中的数据。 第二:在获取存储的数据时。 在第二个要求中,我有一个问题。 我不想验证数据,因为存储的数据可能由于删除或修改现有数据而不符合业务逻辑。 因此,我需要使用保存的数据填充对象,而无需验证 所以,请建议我在类中添加验证逻辑的最佳方法,这样当它用于数据保存时,应该对其进行验证,当获取数据时,如果数据库表中存在键字段,则不应该

我的应用程序中有一个设计问题。 我有一个类,其中的字段具有某种业务逻辑验证。 该类以两种方式实例化和填充数据。。 1:由类的使用者:从前端发送并填充到对象中并保存在数据库中的数据。 第二:在获取存储的数据时。 在第二个要求中,我有一个问题。 我不想验证数据,因为存储的数据可能由于删除或修改现有数据而不符合业务逻辑。 因此,我需要使用保存的数据填充对象,而无需验证

所以,请建议我在类中添加验证逻辑的最佳方法,这样当它用于数据保存时,应该对其进行验证,当获取数据时,如果数据库表中存在键字段,则不应该验证任何字段。 例如:

class客户
{
私有字符串自定义代码;
私有字符串客户名称;
私人清单项目清单;
//这些属性包含分配给它们的数据的验证逻辑。
公共字符串自定义代码{get;set;}
公共字符串CustomerName{get;set;}
公共列表项目列表{get;set;};
公共布尔设置数据(参考字符串消息)
{
//从数据库获取并将其设置为字段。
//在这里,为了避免验证,我可以直接使用字段跳过验证。
this.CustomerCode=DataTable[CustomerCode];
this.CustomerName=DataTable[CustomerName];
//但在这里不可能跳过项目类中的验证
foreach(数据表[Projects]中的projectID)
{
//**问题领域**……我添加的每个项目都根据业务逻辑进行验证,但即使在项目完成后,系统用户也可能希望列出该客户的所有项目。
this.ProjectList.Add(新项目(projectID));
}
}
}

创建位于公共接口后面的特定验证器。然后,如果需要此策略,可以对其进行单元测试并进行潜在替换,以提供自定义验证场景


为验证类作为一个整体以及每个属性提供支持。

一种更通用的方法是让一个对象有两种验证策略。在这种情况下,您会说第二种策略是忽略任何验证。但是,在将来,您可能会发现添加一些次要的或次要的验证是有用的,因此您可以使用更通用的方法。正如Davis Osborne所建议的,验证对象的最佳方法是创建特定的验证类。总之,我将创建两个验证对象,并根据上下文使用适当的对象验证我的对象。通过这种方式,您的方法将准备好使用您将来可能包含的任何验证,您只需要更新设计的验证部分。

阅读验证应用程序块:Thanx,但内容已过时,我只是不想包含任何框架,而是想在我的设计中解决这个问题。在我看来,您的关注点不够分散。您有一个对象是从数据库调用中提取的,所以它应该通过构造函数和您的参数来创建。另一种情况是,您可能有来自用户的部分水合数据。在这两种情况下使用相同的类型似乎并不理想。这意味着您是否建议对同一个实体使用两个不同的类并提供不同的实现,第一个用于读取数据,第二个用于保存数据?实体只是数据的表示。验证是发生在实体上的事情。所以我认为验证不应该被一个实体所包围。是的,你的策略听起来和我最终决定对这个问题建模的策略是一样的。太好了。验证本身就是一个完整的主题。我不想说更多的细节,因为你说你想要一些简单的东西。这是一个开始的好方法。从长远来看,天真的解决方案可能无法实现。如果发生这种情况,您自然会发现需要更详细的验证框架。您可以通过阅读了解我使用的框架。此外,本书还有一章专门讨论验证。
class customer
{
    private string customerCode;
    private string customerName;
    private List<Project> projectList;
    //These property contains validation logic for data assigned to them.
    public string CustomerCode{get; set;}
    public string CustomerName{get; set;}
    public List<Project> projectList{get;set;};

    public bool SetData(ref string message)
    {
        //Fetch From Database and set it to fields.
        //Here to avoid validation I can use fields directly to skip validation.
        this.CustomerCode = DataTable[CustomerCode];
        this.CustomerName = DataTable[CustomerName];

        //But here its not possbible to skip validation in Project class
        foreach(projectID in DataTable[Projects])
        {
            //**Problem Area**.... every project I add is validated according to business logic, but it may be possible that even after completion of a project users of the system want to list all the projects of that customer.
            this.ProjectList.Add(new Project(projectID));
        }
    }
}