EPR类企业管理系统

在我们现有系统基础上或全新开发,提供定制服务
为您的企业高效快速实施ERP,WMS,MES,CRM管理系统
全面管控物料仓库、销售业务、采购业务、仓库业务
生产过程、质量检验、组织架构、业务报表


定制
QQ:460-3528

开发
QQ群:3360-90194

源码
微信:136-3650-3721

实施自定义规则

eXpressApp框架提供了一些规则。通过使用相应的规则属性,您可以轻松地将它们应用于业务类及其属性。要获取可用规则及其属性的列表,请参考“验证规则”主题。由于通用性很强,因此在某些情况下提供的规则可能仍然不合适。在这些情况下,您可以实施自定义验证规则。本主题详细介绍了两种方法:实现将通过特定规则属性应用的典型XAF规则,以及实现将自动应用于指定业务类的规则。

实施常规验证规则

要实施验证规则,请继承任何XAF验证规则类型(在下面列出)。其中一些类型是抽象的,它们代表规则的基础。要实现自定义规则,请从它们继承。要修改特定规则的行为,请直接从其继承。实施规则时,您应注意任何规则附带的两个辅助实体:

  • 规则属性

    若要为业务类或属性创建特定类型规则的实例,应将规则属性应用于该类或属性。每种规则类型都有一个特定的属性。基本上,属性建立检查规则所需的一组参数。实施自定义规则时,应为其实现自定义属性。为此,您可以从RuleBaseAttribute继承,也可以从与您继承的规则相对应的属性继承。在属性中,至少应覆盖受保护的RuleType属性,并返回您的规则类型。

  • 规则属性

    有关在应用程序中创建的规则的信息将保存到应用程序模型中。每个验证规则都通过RuleBase.Properties属性公开RuleBaseProperties类的后代。此后代指定导出到相应验证的规则的属性。规则| 规则子节点。实施自定义规则时,您可以使用以下选项:

    1. 如果需要扩展规则的基本规则使用的Properties类,请执行以下操作。首先,声明一个新的接口,该接口派生自基本Properties类实现的接口。在此界面中声明所需的其他属性。其次,通过从基础Properties类继承来声明新的Properties类。新类必须实现新声明的接口。要创建规则,请使用自定义Properties类,覆盖规则的PropertiesType属性和规则的属性类。在重写的属性中,返回后代Properties类的实例。通过new修饰符隐藏基类的Properties属性。该属性应具有新声明的接口的类型。

    2. 如果您对为规则的基本规则设置的“属性”类型中显示的属性感到满意,则不必覆盖PropertiesType属性。

下表列出了可用的规则类型,相应的属性和属性类型:

规则类型

规则说明

属性类型

属性

规则库

表示实现IRule接口的抽象类。

用作所有规则的基类。

RuleBaseProperties

实现IRuleBaseProperties接口。

--

RuleCombinationOfPropertiesIsUnique

表示RuleSearchObject类的后代。

此规则要求特定属性的值组合是唯一的。

RuleCombinationOfPropertiesIsUniqueProperties

派生自RuleSearchObjectProperties类。实现IRuleCombinationOfPropertiesIsUniqueProperties接口。

RuleCombinationOfPropertiesIsUniqueAttribute

派生自RuleBaseAttribute类。实现IRuleCombinationOfPropertiesIsUniqueProperties接口。

规则标准

表示RuleBase类的后代。

该规则要求特定类型的对象满足指定的条件。

RuleCriteriaProperties

派生自RuleBaseProperties类。实现IRuleCriteriaProperties接口。

RuleCriteriaAttribute

派生自RuleBaseAttribute类。实现IRuleCriteriaProperties接口。

RuleFromBoolProperty

表示RulePropertyValue <TPropertyValue>类的后代。

此规则要求布尔类型属性应具有True值。

RuleFromBoolPropertyProperties

派生自RulePropertyValueProperties类。实现IRuleFromBoolPropertyProperties接口。

RuleFromBoolPropertyAttribute

派生自RuleBaseAttribute类。实现IRuleFromBoolPropertyProperties接口。

规则引用

表示RuleSearchObject类的后代。

该规则要求应在指定类型的对象中引用对象。

RuleIsReferencedProperties

派生自RuleSearchObjectProperties类。实现IRuleIsReferencedProperties接口。

RuleIsReferencedAttribute

派生自RuleBaseAttribute类。实现IRuleIsReferencedProperties接口。

RuleObjectExists

表示RuleSearchObject类的后代。

此规则要求数据库中存在满足指定条件的特定类型的对象。

RuleObjectExistsProperties

派生自RuleSearchObjectProperties类。实现IRuleObjectExistsProperties接口。

RuleObjectExistsAttribute

派生自RuleBaseAttribute类。实现IRuleObjectExistsProperties接口。

RulePropertyValue

表示从RuleBase类派生的抽象类。

用作检查指定属性值的规则的基类。

RulePropertyValueProperties

派生自RuleBaseProperties类。实现IRulePropertyValueProperties接口。

--

RulePropertyValue <TPropertyValue>

表示派生自RulePropertyValue类的抽象类。

用作检查指定属性值的特定类型的规则的基类。

RulePropertyValueProperties

派生自RuleBaseProperties类。实现IRulePropertyValueProperties接口。

--

规则范围

表示RulePropertyValue <TPropertyValue>类的后代。

此规则要求特定属性的值应在指定的值范围内。

RuleRangeProperties

派生自RulePropertyValueProperties类。实现IRuleRangeProperties接口。

RuleRangeAttribute

派生自RuleBaseAttribute类。实现IRuleRangeProperties接口。

RuleRegularExpression

表示RulePropertyValue <TPropertyValue>类的后代。

该规则要求特定的属性应与指定的模式匹配。

RuleRegularExpressionProperties

派生自RulePropertyValueProperties类。实现IRuleRegularExpressionProperties接口。

RuleRegularExpressionAttribute

派生自RuleBaseAttribute类。实现IRuleRegularExpressionProperties接口。

RuleRequiredField

表示RulePropertyValue <TPropertyValue>类的后代。

此规则要求特定属性应具有值。

RuleRequiredFieldProperties

派生自RulePropertyValueProperties类。实现IRuleRequiredFieldProperties接口。

RuleRequiredFieldAttribute

派生自RuleBaseAttribute类。实现IRuleRequiredFieldProperties接口。

RuleSearchObject

表示从RuleBase类派生的抽象类。

用作RuleObjectExistsRuleUniqueValueRuleIsReferenced规则的基类。该规则的检查算法基于根据特定条件搜索对象。

RuleSearchObjectProperties

派生自RuleBaseProperties类。实现IRuleSearchObjectProperties接口。

--

RuleStringComparison

表示RulePropertyValue <TPropertyValue>类的后代。

此规则要求特定String类型属性的值应满足指定条件。

RuleStringComparisonProperties

派生自RulePropertyValueProperties类。实现IRuleStringComparisonProperties接口。

RuleStringComparisonAttribute

派生自RuleBaseAttribute类。实现IRuleStringComparisonProperties接口。

RuleUniqueValue

表示RuleSearchObject类的后代。

此规则要求特定属性的值应唯一。

RuleUniqueValueProperties

派生自RuleSearchObjectProperties类。实现IRuleUniqueValueProperties接口。

RuleUniqueValueAttribute

派生自RuleBaseAttribute类。实现IRuleUniqueValueProperties接口。

RuleValueComparison

表示RulePropertyValue <TPropertyValue>类的后代。

此规则要求特定属性的值满足指定条件。

RuleValueComparisonProperties

派生自RulePropertyValueProperties类。实现IRuleValueComparisonProperties接口。

RuleValueComparisonAttribute

派生自RuleBaseAttribute类。实现IRuleValueComparisonProperties接口。

注意

上表中列出的所有规则,属性类型和属性均在DevExpress.Persistent.Base.v 19.2 .dll程序集中的DevExpress.Persistent.Validation.RuleBase命名空间中声明。

以下代码演示了规则中应包含的关键成员,Properties接口,Properties类型和属性:

//Declare the new Properties interface
[GenerateMessageTemplatesModel("MyRule")]
public interface IRuleMyProperties : IRuleSearchObjectProperties {
    [Category("Data")]
    string AdditionalProperty { get; set; }
}
[DomainComponent] //Here the RuleSearchObjectProperties is used as a base class
public class MyRuleProperties : RuleSearchObjectProperties, IRuleMyProperties {
    private string additionalProperty;
    public string AdditionalProperty {
        get { return additionalProperty; }
        set { additionalProperty = value; }
    }
}
//Here the RuleSearchObject is used as a base class
public class MyRule : RuleSearchObject {
    //A custom rule must have at least two constructors
    //The default constructor
    public MyRule() : base() { }
    //A constructor which takes an IRuleBaseProperties-descendant interface type parameter
    public MyRule(IRuleSearchObjectProperties properties) : base(properties) { }
    protected override bool IsValidInternal(object target, out string errorMessageTemplate) {
        //Check whether the rule is satisfied
    }
    public override ReadOnlyCollection<string> UsedProperties {
        get {
            //Specify the properties that will be highlighted when the rule is broken
        }
    }
    //If you have a custom Properties type, return the Properties object
    //cast to the corresponding interface type
    protected new IRuleMyProperties Properties {
        get {
            return (IRuleMyProperties)base.Properties;
        }
    }
    //If you have a custom Properties type, return it here
    public override Type PropertiesType {
        get {
            return typeof(MyRuleProperties);
        }
    }
}
//Here an abstract RuleBaseAttribute class is used as a base class
public class MyRuleAttribute : RuleBaseAttribute {
    //Return the type of the rule for which you implement this attribute
    protected override Type RuleType {
        get { return typeof(MyRule); }
    }
    //If you have a custom Properties type, return it
    protected override Type PropertiesType {
        get {
            return typeof(MyRuleProperties);
        }
    }
    public MyRuleAttribute(string id, string targetContextIDs, string additionalProperty)
        : base(id, targetContextIDs) {
        Properties.AdditionalProperty = additionalProperty;
    }
    public MyRuleAttribute(string id, DefaultContexts targetContexts, string additionalProperty)
        : base(id, targetContexts) {
        Properties.AdditionalProperty = additionalProperty;
    }
    //If you have a custom Properties type, return the Properties object
    //cast to the corresponding interface type
    protected new IRuleMyProperties Properties {
        get { return (IRuleMyProperties)base.Properties; }
    }
    public string AdditionalProperty {
        get { return Properties.AdditionalProperty; }
    }
}
注意

RuleBaseAttribute后代的Properties属性声明为非公共属性。使用new修饰符隐藏基类的Properties属性。

在实现自定义“属性”类型时,以下属性可能很有用:

  • RulePropertiesRequired

    应用于Properties类的属性。指示与该属性对应的规则节点的属性不能为空。

  • RulePropertiesMemberOf

    应用于属性类的属性,指定参与规则逻辑的业务类属性的名称。此属性的参数传递Properties类的属性的名称,指定包含使用此属性的属性的类型。例如:

    [DomainComponent]
    public class MyRuleProperties : RuleSearchObjectProperties, IRuleMyProperties {
        private Type someType;
        public Type SomeType {
            get { return someType; }
            set { someType = value; }
        }
        private string property1Name;
        [RulePropertiesMemberOf("SomeType ")]
        public string Property1Name{
            get { return property1Name; }
            set { property1Name = value; }
        }
        private string property2Name;
        [RulePropertiesMemberOf("SomeType ")]
        public string Property2Name{
            get { return property2Name; }
            set { property2Name= value; }
        }
    }
    
  • RulePropertiesIndex

    应用于Properties类的属性,以指定相应属性在模型编辑器中的显示顺序。

要注册自定义验证规则,请覆盖将ApplicationModulesManager实例作为参数的模块的Setup方法。以下代码段对此进行了说明。

using DevExpress.ExpressApp;
using DevExpress.ExpressApp.Validation;
//...
public sealed partial class MyModule : ModuleBase {
    //...
    public override void Setup(ApplicationModulesManager moduleManager) {
        base.Setup(moduleManager);
        ValidationRulesRegistrator.RegisterRule(moduleManager, typeof(MyRule), typeof(IRuleMyProperties));
    }
}

要查看实现自定义规则及其属性的示例,请参阅随XAF一起安装的FeatureCenter演示。其中实现了RuleStringLengthComparison,RuleStringLengthComparisonAttribute和 RuleStringLengthComparisonProperties。默认情况下,此演示位于%PUBLIC%\ Documents \ DevExpress演示19.2 \ Components \ eXpressApp Framework \ FeatureCenter文件夹中。

实施代码规则

使用“代码规则”方法,您不会实现自定义属性,也不会将其应用于业务类。当您需要在代码中将验证规则应用于引用的程序集中实现的业务类时,该方法很有用,而无需使用模型编辑器。您还可以使用这种方法通过高度定制的算法来检查对象。

代码规则方法的主要思想是,如上所述,您实现一个自定义规则,并使用CodeRuleAttribute装饰它。这种方法与上述方法的不同之处在于用于收集验证规则的技术。通常,基于应用于业务类的规则属性,将有关验证规则的信息加载到应用程序模型中。但是,通过这种方法,基于使用CodeRule属性修饰的验证规则类,将有关验证规则的信息加载到应用程序模型中。

可以使用以下一种技术在规则的声明中指定规则的目标类:

  • 目标类型被指定为规则基类的通用参数:

    [CodeRule]
    public class MyCodeRule : RuleBase<Contact> {
       protected override bool IsValidInternal(
          Contact target, out string errorMessageTemplate) {
          //Check whether the rule is satisfied
       }
        public MyCodeRule() : base("", "Save") { }
        public MyCodeRule(IRuleBaseProperties properties) : base(properties) { }
    }
    
  • 目标类型作为基本规则的构造函数的参数传递:

    [CodeRule]
    public class MyCodeRule : RuleBase {
       protected override bool IsValidInternal(
          object target, out string errorMessageTemplate) {
          //Check whether the rule is satisfied
       }
        public MyCodeRule() : base("", "Save", typeof(Contact)) { }
        public MyCodeRule(IRuleBaseProperties properties) : base(properties) { }
    }
    

可以在重写的IRule.UsedProperties属性getter中指定规则的目标属性(属性,在违反规则时在UI中突出显示)。

using System.Collections.ObjectModel;
// ...
public override ReadOnlyCollection<string> UsedProperties {
    get {
        return new ReadOnlyCollection<string>(new List<string>() { "Amount" });
    }
}

不要忘记通过重写将ApplicationModulesManager实例作为参数的模块的Setup方法来注册规则。

using DevExpress.ExpressApp;
using DevExpress.ExpressApp.Validation;
//...
public sealed partial class MyModule : ModuleBase {
    //...
    public override void Setup(ApplicationModulesManager moduleManager) {
        base.Setup(moduleManager);
        ValidationRulesRegistrator.RegisterRule(moduleManager, typeof(MyCodeRule), typeof(IRuleBaseProperties));
    }
}

要查看使用CodeRule属性实现自定义规则的示例,请参阅FeatureCenter演示和此演示中实现的CodeRuleObjectIsValidRule

相关文章

转载保留此链接,注明出处