设计Business Objects以指示诸如Max Length之类的约束

时间:2010-02-16 17:35:38

标签: oop validation business-objects

在设计业务对象时是否存在标准约定,以便为消费者提供发现约束(如属性的最大长度)的方法?

它可以在UI层中用完,例如,根据业务对象中的最大长度限制设置Textbox的MaxLength属性。

这是否有标准的设计方法?

3 个答案:

答案 0 :(得分:1)

验证框架通常包含用于与UI技术集成以传达错误的部分。例如Microsoft Enterprise Library Validation Application Block包含一个WinForms的ValidationProvider扩展器控件,它与WinForms ErrorProvider控件绑定。

你的愿望虽然不同。您希望在它们转入错误之前传达约束。因为这不是一个标准要求,我不相信大多数验证框架都有开箱即用的东西。但是,根据所选择的框架创建,这可能是可以实现的。例如,验证应用程序块允许您分析在实体上注册/配置的规则。因此,可以构建一个可以为您完成此操作的控件。

[编辑] 您还可以做的是在启动时和每次击键后立即验证表格。这会导致错误图标或消息立即显示,这允许用户直接查看约束是什么(当您使用图标时,用户可以悬停图标以查看错误消息)。这可能不如创建自己的控件那么好,但实现起来要容易得多。

答案 1 :(得分:0)

我有自己的验证框架,可以让我在指定的ValidationAttribute的帮助下验证每个字段。它使用Attributes来自动化大多数验证。

示例业务对象在我的应用程序中看起来像这样。

每个业务对象都将从EntityBase抽象类继承,该抽象类具有名为“Validate()”的公共方法。当在业务对象的给定实例上调用此方法时,它将遍历其自身的所有属性,其具有从ValidationAttribute派生的属性,可以调用ValidationAttriubte的IsValid方法来验证关联的proerty的值,并使用err返回true / false。 msg,如果有的话。

<强> User.cs

[TableMapping("Users")]
public class User : EntityBase
{
    #region Constructor(s)
    public AppUser()
    {
        BookCollection = new BookCollection();
    }
    #endregion

    #region Properties

    #region Default Properties - Direct Field Mapping using DataFieldMappingAttribute

    private System.Int32 _UserId;

    private System.String _FirstName;
    private System.String _LastName;
    private System.String _UserName;
    private System.Boolean _IsActive;

    [DataFieldMapping("UserID")]
    [DataObjectFieldAttribute(true, true, false)]
    [NotNullOrEmpty(Message = "UserID From Users Table Is Required.")] // VALIDATION ATTRIBUTE
    public override int Id
    {
        get
        {
            return _UserId;
        }
        set
        {
            _UserId = value;
        }
    }

    [DataFieldMapping("UserName")]
    [Searchable]
    [NotNullOrEmpty(Message = "Username Is Required.")] // VALIDATION ATTRIBUTE

    public string UserName
    {
        get
        {
            return _UserName;
        }
        set
        {
            _UserName = value;
        }
    }

    [DataFieldMapping("FirstName")]
    [Searchable]
    public string FirstName
    {
        get
        {
            return _FirstName;
        }
        set
        {
            _FirstName = value;
        }
    }

    [DataFieldMapping("LastName")]
    [Searchable]
    public string LastName
    {
        get
        {
            return _LastName;
        }
        set
        {
            _LastName = value;
        }
    }

    [DataFieldMapping("IsActive")]
    public bool IsActive
    {
        get
        {
            return _IsActive;
        }
        set
        {
            _IsActive = value;
        }
    }

    #region One-To-Many Mappings
    public BookCollection Books { get; set; }

    #endregion

    #region Derived Properties
    public string FullName { get { return this.FirstName + " " + this.LastName; } }

    #endregion

    #endregion

    public override bool Validate()
    {
        bool baseValid = base.Validate();
        bool localValid = Books.Validate();
        return baseValid && localValid;
    }
}

<强> BookCollection.cs

/// <summary>
/// The BookCollection class is designed to work with lists of instances of Book.
/// </summary>
public class BookCollection : EntityCollectionBase<Book>
{
    /// <summary>
    /// Initializes a new instance of the BookCollection class.
    /// </summary>
    public BookCollection()
    {
    }

    /// <summary>
    /// Initializes a new instance of the BookCollection class.
    /// </summary>
    public BookCollection (IList<Book> initialList)
        : base(initialList)
    {
    }
}

答案 2 :(得分:0)

Custom Attributes可能符合您的需求。