我无法在课堂上配置代码合同。我已经按照文档和示例进行操作,但它不起作用。
我想将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");
但是当我调用方法时,它永远不会通过这里 这是我的项目配置
有什么不对吗?
谢谢!
答案 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
。