как настроить кодовые контракты в интерфейсе - PullRequest
7 голосов
/ 12 апреля 2011

Я не могу настроить кодовые контракты в моем классе. Я следовал за документацией и примером, но он не работает.

Я бы вставил условие Code Contracts в мой интерфейс, здесь мой код

Интерфейс

 [ContractClass(typeof(ArticleBLLContract))]
 public interface IArticleBLL
 {
    int getArticleNSheet(string IdBox);
    IEnumerable<IArticle> getArticleValue(string IdBox, string IdLanguage);
}

Класс договора

[ContractClassFor(typeof(IArticleBLL))]
public sealed class ArticleBLLContract : IArticleBLL
{
    int IArticleBLL.getArticleNSheet(string IdBox)
    {
        Contract.Requires<ArgumentOutOfRangeException>(!String.IsNullOrEmpty(IdBox),"IdBox has no valid value");                        

        return default(int);
    }

    IEnumerable<Base.Article.IArticle> IArticleBLL.getArticleValue(string IdBox, string IdLanguage)
    {
        Contract.Requires<ArgumentOutOfRangeException>(!String.IsNullOrEmpty(IdBox), "IdBox has no valid value");
        Contract.Requires<ArgumentOutOfRangeException>(!String.IsNullOrEmpty(IdLanguage), "IdLanguagehas no valid value");

        Contract.Ensures(Contract.Result<IEnumerable<Base.Article.IArticle>>() != null, "Return value is out of Range");

        return default(IEnumerable<Base.Article.IArticle>);
    }        
}

Класс для применения контракта

public class ArticleBLL : IArticleBLL
{

    public int getArticlNSheet(string IdBox)
    {
        try
        {
            return _Dal...
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

    public IEnumerable<IArticle> getArticleValue(string IdBox, string IdLanguage)
    {
        IEnumerable<IArticle> article = null;

        try
        {
            article = _Dal...

            return article;

        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
}

Я пытался вставить точку останова в этой строке

Contract.Requires<ArgumentOutOfRangeException>(!String.IsNullOrEmpty(IdBox),"IdBox has no valid value");  

но когда я вызываю метод, он никогда не проходит здесь Это конфигурация моего проекта Code Contracts Config

Что-то не так?

Спасибо!

Ответы [ 2 ]

4 голосов
/ 13 апреля 2011

Режим сборки в вашей конфигурации должен быть «Требуется стандартный контракт».

3 голосов
/ 13 апреля 2011

Всего переписать, основываясь на комментариях до сих пор

Я создал проект библиотеки классов и поместил туда интерфейс и класс контракта. Я установил для него значение «Требуется стандартный контракт», проверки до и после выполнения и справочную сборку контракта сборки (я установил идентичные параметры для отладки и выпуска).

Затем я получил консольное приложение с классом, реализующим интерфейс, и установил «Стандартные условия контракта», проверки до и после выполнения (опять же, одинаково между Debug и Release).

При запуске в режиме отладки или выпуска, я получаю ArgumentOutOfRangeException при попытке вызвать getArticleNSheet.

С очевидным исключением переключения на "Требуется стандартный контракт", что в приведенном выше не соответствует вашей текущей настройке?


И, фактически, я ошибался ранее. С помощью «Требуется стандартный контракт» я на самом деле могу достичь точки останова в классе контракта при отладке. Я не уверен, каким Wizardry он способен это сделать - поскольку он не выполняет буквально код в этом классе - о чем свидетельствует тот факт, что вы можете переписать метод в классе контракта следующим образом:

    int IArticleBLL.getArticleNSheet(string IdBox)
    {
        Contract.Requires<ArgumentOutOfRangeException>(!String.IsNullOrEmpty(IdBox), "IdBox has no valid value");

        throw new NotImplementedException();
    }

Вы можете поместить точку останова в строку Contract.Requires, и она, кажется, достигает ее (после предупреждения о несоответствии файлов, возможно, из-за перезаписи). Но при условии, что вы передали непустую строку, она не выдаст NotImplementedException.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...