3

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)を呼び出すと、警告は生成されませんが、アプリケーションを実行すると、上記の行でコントラクト例外が発生します。

私のアプローチに何か問題がありますか?

前もって感謝します。

誰もが理解しやすいと思う別の例を作成しました。

クラスライブラリプロジェクトで次のクラスを作成しました。

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);

契約がフルフィールドではないという警告は表示されません。

それが私の問題です、私はそれが今より明確になることを願っています。

ありがとう。

4

1 に答える 1

1

インターフェイスの ContractClass 属性を見逃したと思います:

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

ここにコード コントラクトに関する適切な説明があります。

于 2012-05-22T04:59:16.390 に答える