これは、格納されるエンティティがnullではなく、永続化に有効であることを検証します。できます。すばらしい。
[ContractClassFor(typeof(IRepository<,>))]
internal abstract class ContractsForIRepository<T, TId> : IRepository<T, TId> where T : IEntity
{
private ContractsForIRepository()
{
}
public T Persist(T entity)
{
Contract.Requires<InvalidEntityException>(entity != null, "Entity is null");
Contract.Requires<InvalidEntityException>(entity.IsValidForPersistence(), "Entity not valid for persistence");
return default(T);
}
}
ただし、メッセージを受信した人は、どのエンティティが無効で、どのように見えるかを知りたがるので、例外をもっと便利にしたいと思います。すべてのエンティティが ToString() をオーバーライドするため、これをエラー メッセージに含めたいと思いました。
Contract.Requires<InvalidEntityException>(entity.IsValidForPersistence(), "Entity not valid for persistence " + entity.ToString());
ToString を明示的に含めました。省略した場合は暗黙的に呼び出されますが、質問がより明確になると思います。
問題は、これがコード コントラクトで許可されておらず、次のメッセージが表示されることです。
コントラクト呼び出しへのユーザー メッセージは、文字列リテラル、静的フィールド、または少なくとも内部的に可視な静的プロパティのみにすることができます。
例外メッセージに特定のデータを含める方法はありますか?