gpt4 book ai didi

c# - 中间层验证

转载 作者:行者123 更新时间:2023-12-02 13:42:01 24 4
gpt4 key购买 nike

我想对我的业务代码进行验证。我正在考虑两种方法来做到这一点。

一,按以下方式对我的类属性 setter 进行验证

class Student{
public string Name{
get { return _name; }
set {
if (value.IsNullOrEmpty) throw exception ...
}
}
}

现在,这种方法的问题在于,每次分配 Name 时都会运行验证代码,而我们可能不需要,例如用数据库中的数据填充它时。

我更喜欢其中两个,将静态方法放在这些实体类上,例如

class Student {
public **static** void ValidateName(**string name**) {
if (string.IsNullorEmpty(name))
{
throw ...
}
...
}

请注意,我使用的是静态方法而不是实例方法,例如

class Student{
public void Validate() {
// validation logic on instance properties
if (string.IsNullorEmpty(Name))
{
throw ...
}

...
}

是因为我并不总是传入 Student 对象,我确实经常将原始类型(例如字符串名称)传递到方法中,例如

public static FindStudentByName(string name)
{
// here I want to first do validation
Student.ValidateName(name);

// query DB
...
}

如果我确实通过了学生对象,那么我当然可以这样做

public static AddStudent(Student s)
{
// call the instance method
s.Validate();
}

现在,我想让事情变得非常简单,所以我不想采用以下任何一种方法

  1. 在属性上使用属性,例如 [StringLength(25)]。

    第一,因为这需要反射并影响性能,所以有一些技巧可以降低性能,但我还是想让它越简单越好。

    第二,我希望我的网站能够在中等信任度下运行。据我了解,反射(reflection)需要充分的信任。

  2. 使用任何现有的验证 block ,例如 MS。在 CodePlex 上找到企业库等。

现在,我想听听您对此的看法,

我所采用的方法有哪些潜在问题?
这种方法会比其他方法表现更好、更具可读性、更容易维护吗?

您如何在中间层进行验证?

非常感谢!

雷.

最佳答案

我使用规则引擎在中间层执行域验证,与written about here非常相似。 。 friend 的项目使用的方法类似于您在后一个示例中提出的方法,但最终结果是无法维护的(脆弱,难以实现通用验证 UI)。规则引擎方法是可维护的,因为它将所有验证和持久性规则本地化在一个组织良好的位置中,并且将每个规则作为一个完全成熟的类 - 但公开了与您所提议的类似的域类的验证。有些人喜欢动态编译,因此他们将它们存储在数据库中以进行高级部署后配置;就我而言,我喜欢检查它们的编译时间,以便在静态类上公开带有 lambda 的规则定义。

我知道这不符合您想要做的事情,但是问我将如何做到这一点并说其他方法不够简单就像在说“您如何编写可靠的代码,我想保留它很简单,所以单元测试是不可能的。”对我来说,将每个规则视为自己的类是很好的,因为它更容易维护和记录,尽管实现起来更复杂。

关于c# - 中间层验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/251209/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com