代码合约和 MVVM

Posted

技术标签:

【中文标题】代码合约和 MVVM【英文标题】:Code Contracts and MVVM 【发布时间】:2012-05-21 19:36:52 【问题描述】:

我有一个 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(null) 在任何方法中,都会生成警告。 在我的 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);

我没有收到关于合同不完整的警告。

这是我的问题,我希望现在更清楚了。

谢谢。

【问题讨论】:

你能把你的问题说得更具体一些吗? 您收到的具体警告是什么? 对不起,我不是很清楚。我的问题是,当我在 ViewModel 中调用 this.Save(null) 时,静态检查不起作用,就在 Model 中。 我从包含更多内容的代码中复制而来,因此我更改了一些内容以使其更具可读性,其中 c042 应该是实体。 类的实现是什么样的?您是否覆盖保存和删除?您可能必须在抽象基类中将它们声明为虚拟的。或者为什么 C042_Model_Contracts 是抽象的? 【参考方案1】:

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

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

关于代码合约有很好的描述here

【讨论】:

我在两个类中都添加了属性。正如我之前所说,在模型中会出现波浪形,但在我的 ViewModel 中不会。

以上是关于代码合约和 MVVM的主要内容,如果未能解决你的问题,请参考以下文章

发明者量化商品期货合约代码明细

发明者量化商品期货合约代码明细

第一行代码:以太坊-使用Solidity语言开发和测试智能合约

合约代码无法存储,请检查您的gas限制:以太坊智能合约部署失败:

验证使用 Truffle 部署的智能合约代码

07 Vue基本代码和MVVM之间对应的关系