代码契约和MVVM

时间:2012-05-21 19:36:53

标签: c# mvvm code-contracts

我在C#中有一个MVVM项目,我想在其中使用代码契约。 所以这是我的情景: 接口:

public interface IC042_Model
{
    void Save(C042 entity);
    void Delete(C042 entity);
}

然后我有合同的抽象类:

[ContractClassFor(typeof(IC042_Model))]
internal abstract class C042_Model_Contracts : IC042_Model
{
    public void Save(C042 entity)
    {
        Contract.Requires(entity != null);
    }

    public void Delete(C042_CondicaoPagamento entity)
    {
        Contract.Requires(entity != null);
    }
}

在另一个项目中,我的模型实现了接口,如果我打电话     this.Save(空) 在任何方法中,都会生成警告。 在我的ViewModel中,如果我调用上面相同的方法:this.Save(null),不会生成警告,但是当我运行应用程序时,上面的行会引发一个Contract异常。

我的方法有什么问题吗?

提前致谢。

我做了另一个例子,我认为每个人都更容易理解:

我在类库项目中创建了以下类:

public static class StringExtensions
{
    public static string TrimAfter(string value, string suffix)
    {
        Contract.Requires(suffix != (string)null);
        Contract.Requires(!string.IsNullOrEmpty(suffix));
        Contract.Requires(value != null);

        var index = value.IndexOf(suffix);

        if (index < 0)
            return value;

        return value.Substring(0, index);
    }
}

当我从如下的WPF项目中调用它时:

CodeDigging.StringExtensions.TrimAfter(null, null);

我没有得到合同不是全场的警告。

这是我的问题,我希望它现在变得更加清晰。

感谢。

1 个答案:

答案 0 :(得分:1)

我认为你错过了界面上的ContractClass属性:

[ContractClass(typeof(C042_Model_Contracts)]
public interface IC042_Model 
{ 
    void Save(C042 entity); 
    void Delete(C042 entity); 
} 

关于代码合同here

的描述很好