c# - 使用自定义规则进行动态验证

标签 c# .net design-patterns c#-4.0 business-rules

我已经使用 .Net 语言 4 年了。我使用 WCF、用于 Web 应用程序的 ASP.NET 和用于 Windows 应用程序的 C# 开发 3 层和 5 层应用程序。每次我开始一个项目时,业务规则和验证都是一个问题。

我应该在哪里放置自定义验证规则(按钮单击事件、页面加载或在我的类中的 setter/getter 中)?

如果一个项目很大并且只有一个字段而不是 5 个字符应该是 7 个字符 - 我为什么要重建整个项目(或业务类项目)?

我想如果我有一个包含我的自定义规则的文件,那么当需要更改时,我可以简单地在其中放置一个新规则。我在互联网上阅读了一些为此目的提供基于 XML 的文件的文章,但这似乎有问题,因为:

  • 没有 Intellisense,XML 文件中的错误很难找到
  • 我们必须编写自定义 XML 解析器
  • 由于此方法需要多次转换,因此非常慢

我的问题:

是否有设计模式或任何其他使用 .NET 方法(反射、表达式树、Lambda 表达式、动态、DLL 的运行时创建等)来使用自定义规则进行动态验证?


编辑 1)

属性呢?我们可以将它们与反射自定义验证一起使用吗?我们可以用这种方法根据另一个属性(形式示例 P1 应该是 P2+1)验证一个属性吗?

最佳答案

表示业务规则的最佳方式是在 xml 中。要充分利用此表示法,您应该从定义规则引擎的数据模型的结构开始,即回答这些问题。

  1. 规则是什么?
  2. 规则是否可以分类?
  3. 规则是否包含通用属性(属性),例如允许的值、格式等?

完成此操作后,创建一个虚拟规则 xml,然后基于此 xml 派生一个 xml 模式。 xsd.exe工具可以帮助您创建模式。如果可以使用 Altova XmlSpy 等工具,创建模式会更容易。 .

至于您具体问题的答案,

  • We can't using Intellisense and if we have error in XML file it is very hard to find it.

一旦您有了架构,Visual Studio 就会为创建 xml(包括智能感知和验证)提供充分的支持。

  • We should write a custom xml parsers

不需要,XmlSerializer Class为序列化/反序列化提供逻辑,即将规则 xml 转换为规则数据模型,反之亦然。

  • Because this method needs numerous casting ,it's very slow

好吧,与硬编码规则(作为类嵌入程序集的规则)相比,这是部分有效的观点,但这种方法的灵 active 远远超过任何性能缺陷。如果规则发生变化,您无需重建解决方案。在大多数情况下,性能影响很小。

除非您有严格的性能标准,否则 xml 方法是实现规则引擎的首选方法。请记住,您的架构耦合越松散,运行时的灵 active 就越高,但会对性能产生负面影响。

示例规则

<RulesEngine>
  <Rules>
    <Rule Id="Rule1">
      <Function>
        <Equals>
          <Property name="Property1" classId="MyClassId"/>
            <Sum>
              <Property name="Property2" classId="MyClassId"/>
              <Constant type="UInt16" value="1"/>
            </Sum>
          </Equals>
        </Function>
      </Rule>
    </Rules>
    <Classes>
    <Class name="MyNamespace.MyClass" Id="MyClassId">
      <Property name="Property1" type="UInt16"/>
      <Property name="Property2" type="UInt16"/>
    </Class>
  </Classes>
</RulesEngine>

规则引擎需要解释这个规则并据此推导出含义。

关于c# - 使用自定义规则进行动态验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7082705/

相关文章:

c# - Linq to SQL DataContext 生命周期管理问题

c# - 当你等待一个失败的任务时会发生什么

C# 寻找模式想法 - 带构造函数的继承问题

design-patterns - 存储库类中要放入多少内容?

c# - XML 存储库实现

c# - 如何在 Roslyn ( Microsoft.CodeAnalysis ) 中向生成的方法添加参数? - 需要准确的语法

c# - 如何在 C# 中定义鼠标手势

c# - 根据 npgsql 未找到字段,但根据 pgadmin 存在

asp.net - 使用ASP.Net Web API的多部分表单POST

c# - 如何在不将整个文件加载到内存的情况下更新 xml 文件