如何在接口中配置代码约定

时间:2011-04-12 12:28:41

标签: c# interface code-contracts

我无法在课堂上配置代码合同。我已经按照文档和示例进行操作,但它不起作用。

我想将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 个答案:

答案 0 :(得分:4)

配置中的装配模式应为“标准合同要求”。

答案 1 :(得分:3)

根据目前为止的评论进行全面重写

我已经创建了一个类库项目,并将接口及其契约类放在那里。我已将其设置为“标准合同要求”,运行时前后检查和构建合同参考程序集(我为调试和发布设置了相同的选项)。

然后我得到了一个控制台应用程序,其中有一个实现该接口的类,并设置了“标准合同要求”,运行时前置和后置检查(再次,在调试和发布之间设置相同)。

在调试模式或发布模式下运行,尝试拨打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