【问题标题】:Code Contracts and MVVM代码合约和 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 是抽象的?

标签: c# mvvm code-contracts


【解决方案1】:

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

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

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

【讨论】:

  • 我在两个类中都添加了属性。正如我之前所说,在模型中会出现波浪形,但在我的 ViewModel 中不会。
猜你喜欢
  • 2012-10-27
  • 1970-01-01
  • 2011-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
相关资源
最近更新 更多