ドメイン オブジェクトのデフォルト値、おそらく Null オブジェクトを指定できますか? ( http://en.wikipedia.org/wiki/Null_Object_pattern ) そうすれば、例外ハンドラを賢くする必要はなくなります。メソッドまたはプロパティのいずれかが使用されたときに、ドメイン オブジェクトの Null オブジェクト インスタンスがまったく何もしないようにします。
もう 1 つの方法は、[SuppressMessage] を使用してコード分析メッセージを回避し、パラメーターがゼロのコンストラクターを持たないようにすることです。問題は、クラスがシリアル化できなくなったことです。これは、問題になる場合とそうでない場合があります。
最後に、DomainObjectExceptionHandler という中間クラスを作成することを検討してください。例外が発生した場合の処理を担当します。
public abstract class DomainObjectExceptionHandlerBase {
public abstract void HandleException();
}
次に、実際のドメイン オブジェクトで例外が発生したときに何をすべきかを認識している実装を用意します。
public class DomainObjectExceptionHandler : DomainObjectExceptionHandlerBase {
private DomainObject domainObject;
public DomainObjectExceptionHandler(DomainObject domainObject) {
this.domainObject = domainObject;
public override void HandleException() {
// do real recovery work with the domain object
}
}
そして、何もしない null オブジェクト:
public class NullDomainObjectExceptionHandler : DomainObjectExceptionHandlerBase {
public override void HandleException() {
// do nothing
}
}
これで、例外クラスに次の 4 つの推奨シグネチャを含めることができます。
public class DomainObjectException {
public DomainObjectException() {
this.Handler = new NullDomainObjectExceptionHandler();
}
public DomainObjectException(DomainObject domainObject) {
this.Handler = new DomainObjectExceptionHandler(domainObject);
}
public DomainObjectExceptionHandlerBase Handler { get; private set; }
}
スローするコードは次のようになります。
if (domainObject.IsUnhappy())
throw new DomainObjectException(domainObject);
例外ハンドラは次のようになります。
try {
FrobulateDomainObjects();
} catch (DomainObjectException ex) {
ex.Handler.HandleException();
}
例外ハンドラーが DomainObject の存在を知る必要がないことに注意してください。DomainObjectExceptionHandler に委任します。