代码合约未使用ContractClassFor应用

时间:2013-11-07 16:44:47

标签: c# wcf code-contracts

这个让我难过。我在使用合同的方法是接口实现的场景中使用代码约定。所以,我使用抽象的ContractClassFor方法来定义合同要求。这适用于其中一个实现类(它恰好与接口在同一个项目中),但契约永远不会应用于第二个实现(在单独的项目中)。两个项目都具有相同的代码合同设置(标准合同要求;完整运行时合同检查)。这是代码中的场景:

namespace First.Interfaces {
    [ContractClass(typeof(ContractForIMyClass))]
    public interface IMyClass {
        void MyMethod(int id);
    }

    [ContractClassFor(typeof(IMyClass))]
    public abstract class ContractForIMyClass : IMyClass
    {
        void MyMethod(int id) {
            Contract.Requires<ArgumentException>(id != 0);
        }
    }
}

namespace First {
    public class MyClass : IMyClass {
        public void MyMethod(int id) {
            //contract is applied here
        }
    }
}

namespace Second {
    public class MyTestClass : IMyClass {
        public void MyMethod(int id) {
            //contract is not applied
        }
    }
}

任何想法在哪里都非常感激。

1 个答案:

答案 0 :(得分:4)

为此,您需要做两件事:

  1. 为包含接口的程序集构建合同引用程序集。
  2. 在构建包含第二个类的项目时使用合同引用程序集。
  3. 可以从Visual Studio中相应项目的属性页中的“代码约定”部分控制这两个选项。 (如果您在单个解决方案中使用标准项目引用,则在修复#1后,您可能不需要为#2执行任何操作。)