Кодовые контракты и валидаторы ASP.Net - PullRequest
1 голос
/ 30 сентября 2011

Представьте, что у меня есть метод с контрактом:

public void Do(string value)
{
     Contract.Requires<ArgumentNullException>(!string.IsNullOrEmpty(value));
     MyBusiness.Handle(value);
}

Этот метод вызывается с веб-сайта asp.net 2.0, а значение извлекается из текстового поля, обязательно:

<asp:TextBox ID="txtValue" runat="server" />
<asp:RequiredFieldValidator runat="server" ControlToValidate="txtValue" ErrorMessage="boom" />
<asp:Button ID="btnDo" OnClick="btnDo_Click" Text="Do" />

Классический код:

protected void btnDo_Click(object source, EventArgs e)
{
    Page.Validate();
    if(Page.IsValid)
    {
         Do(txtDo.Text);
    }
}

Этот код работает, но генерирует код контракта с предупреждениями: Requires unproven (!string.IsNullOrEmpty(value)), что позволяет мне думать (что неудивительно, однако), что статическая проверка недостаточно умна, чтобы увидеть Page.IsValid (это, вероятно, будет гораздо более сложным Статическая проверка, чтобы иметь такой интеллект).

Какие у меня варианты в этом случае?

Опция, которую я вижу, состоит в том, чтобы помочь статической проверке с предположением:

protected void btnDo_Click(object source, EventArgs e)
{
    Page.Validate();
    if(Page.IsValid)
    {
         Contract.Assume(!string.IsNullOrEmpty(value));
         Do(txtDo.Text);
    }
}

Это имеет смысл для работы, как и ожидалось, но на стороне клиента много шума из контракта. Рассмотрим крупный проект.

Есть идеи / предложения?

1 Ответ

0 голосов
/ 30 сентября 2011

Я думаю, что Contract.Assume() - правильный выбор здесь.Да, это шумно, но я не знаю лучшего способа, который не усложнил бы проблему.

...