Проектирование бизнес-объектов для указания ограничений, таких как максимальная длина - PullRequest
2 голосов
/ 16 февраля 2010

Существует ли стандартное соглашение при проектировании бизнес-объектов для предоставления потребителям способа обнаружить ограничения, такие как максимальная длина объекта?

Может использоваться на уровне пользовательского интерфейса, например, для установки свойства MaxLength текстового поля в соответствии с максимальным пределом длины в бизнес-объекте.

Существует ли для этого стандартный дизайн?

Ответы [ 3 ]

1 голос
/ 17 февраля 2010

Платформы валидации часто содержат части для интеграции с технологиями пользовательского интерфейса при передаче ошибок. Блок приложения проверки корпоративной библиотеки Microsoft , например, содержит элемент управления расширения ValidationProvider для WinForms, который связывается с элементом управления WinForms ErrorProvider .

Ваше желание отличается, хотя. Вы хотите сообщить об ограничениях, прежде чем они превратятся в ошибки. Поскольку это не стандартное требование, я не верю, что в большинстве сред валидации есть что-то для этого из коробки. Однако, в зависимости от выбранной структуры, это может быть достигнуто. Например, блок приложения проверки позволяет анализировать правила, которые вы зарегистрировали / настроили для объекта. Таким образом, можно создать элемент управления, который сделает это за вас.

[Изменить] Что вы также можете сделать, это проверить форму сразу после запуска и после каждого нажатия клавиши. Это приводит к немедленному отображению значков ошибок или сообщений, что позволяет пользователям непосредственно видеть ограничения (при использовании значков пользователь может навести значок, чтобы увидеть сообщение об ошибке). Возможно, это не так приятно, как создание собственного элемента управления, но его гораздо проще реализовать.

0 голосов
/ 17 февраля 2010

Пользовательские атрибуты могут удовлетворить ваши потребности.

0 голосов
/ 17 февраля 2010

У меня есть своя собственная структура проверки, которая позволяет проверять каждое поле с помощью назначенного атрибута ValidationAttribute. Он использует атрибуты для автоматизации большинства проверок.

Пример бизнес-объекта будет выглядеть в моем приложении следующим образом.

Каждый бизнес-объект наследовал бы от абстрактного класса EntityBase, у которого есть открытый метод с именем «Validate ()». Когда этот метод вызывается для данного экземпляра бизнес-объекта, он будет перебирать все свои собственные свойства, имеющие атрибуты, производные от ValidationAttribute, может вызывать метод IsValid ValidationAttriubte для проверки значения соответствующего свойства и возврата true / false с ошибкой. Сообщение, если есть.

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)
    {
    }
}
...