私はリクエストオブジェクトを発行するブローカクラスを持っており、カップルプロパティを合理的な値に変更してリクエストオブジェクトを返すことを期待しています。問題は、前記ブローカの消費者がでないことは、そのオブジェクトのreadonlyプロパティを変更したり、別のリクエストインスタンスを作成して読み取り専用保護を無効にしたり、ブローカが壊れて例外をスローすることができないことです。ブローカのクラス保存が要求オブジェクトを作成しようとすると、コンパイルに失敗する方法を見つけたいと思います。どうすればAクラスがA.Bインスタンスを作成できますか?
私は、要求オブジェクトのインスタンス化を密封して、ブローカ内部からのみ行うことができると思っています。リードオンリープロパティと結合されたきちんとしたアイデアです。要求プロセッサは決してシステムを不正にすることはできません。
public class PermissionsRequestBroker {
public PermissionsRequest Test() {
return new PermissionsRequest();
}
private class PermissionsRequest {
private PermissionsRequest() {
}
}
}
しかし、ブローカがリクエストオブジェクトを作成できないため、失敗します。
私は、同様のアプローチを試みたが、このようなインターフェイスを持つ:
public class PermissionsRequestBroker {
public IPermissionsRequest Test() {
return new PermissionsRequest();
}
public interface IPermissionsRequest {
}
private class PermissionsRequest : IPermissionsRequest {
public PermissionsRequest() {
}
}
}
しかし、要求プロセッサはIPermissionsRequestを実装し、そのようシステムを欺くことができます。確かに私は実行時のチェックを実装することができるので、返されたオブジェクトは依然としてブローカのPermissionRequestオブジェクトですが、それはまだ実行時のチェックであり、例外がスローされます。
私はすべて例外ですが、IDEエクステンションやNuGetパッケージをインストールすることなく、コンパイル時にその契約を強制する方法があるはずです。
あなたはどのような問題を解決しようとしていますか?あなたは "カンニング"で何を意味しますか?あなたのライブラリのユーザーを信頼しませんか?あなたは 'sealed'キーワードを見ましたか? – Aron
最初のケースでコンストラクタを非公開にしたのはなぜですか?クラス自体はプライベートなのですが、あなたの問題を解決している間に公開しませんか? – Madhusudhan
@Aron PermissionRequestインスタンスには、決して変更する必要のないRequestIdプロパティがあります。IE:ブローカーがID:0のリクエストを手渡す場合、ブローカーはあなたがその同じIDで返信することを期待するか、ブローカー自体が壊れて別のリクエスト元に返信します。 – Machinarius