3

Java でファサード パターンを実装する場合、package-private 修飾子を使用して、ファサードのサブシステムを簡単に非表示にできます。その結果、ファサード/パッケージの外部からアクセスできる小さなインターフェイスしかなく、サブシステムの他のクラスは表示されません。

ご存じのとおり、C# には package-private 修飾子はありませんが、internal と呼ばれる同様の修飾子があります。ドキュメントによると、内部として定義されたクラスは、同じアセンブリ内でのみアクセスできます

私が理解していることから、ファサードのサブシステムを物理的に隠すために、少なくとも 2 つのアセンブリ (実際には 2 つの .exe/.dll ファイルを意味します) を作成する必要があります。物理的には、クラスは a) 外部からインスタンス化できず、b) ファサードの外部のインテリセンスによって表示されないことを意味します。

  1. internal キーワードが効果を発揮するように、小さなプロジェクトを 1 つの .exe と 1 つの .dll (ファサード用) に分割する必要がありますか? 私のファサードのサブシステムは 2 つのクラスのみで構成されており、独自の .dll はやり過ぎのようです。
  2. はいの場合、Visual Studio でファサードを独自のアセンブリにアウトソーシングするベスト プラクティスの方法は何ですか?

誤解しないでください。プログラムをいくつかのアセンブリに分割する必要はありません。ファサードの背後にあるいくつかのクラスを IntelliSense から隠し、外部からのインスタンス化を防ぎたいだけです。しかし、私が間違っていなければ、これほど簡単な方法はありません。

4

1 に答える 1

3

別のプロジェクトを使用することは、一般的に推奨されるアプローチです。実際、多くの場合、実装アセンブリと UI アセンブリの両方が参照する 3 番目のアセンブリにインターフェイスまたはファサードがあります。

つまり、入れ子になったプライベート サブクラスを使用して、単一のアセンブリでこれを実現できます。

public interface IMyService {}

public static class MyServiceBuilder
{
    public static IMyService GetMyService()
    {
        //Most likely your real implementation has the service stored somewhere
        return new MyService();
    }

    private sealed class MyService : IMyService
    {
        //...
    }
}

外側のクラスは、プライバシー スコープの目的で効果的に「パッケージ」になります。おそらく、大きな「パッケージ」に対してこれを行いたくないでしょう。そのような場合は、コードを別のアセンブリに移動して internal を使用する方がクリーンです。

複数のアセンブリに対する主な反対理由が展開である場合は、より単純な実行可能ファイルまたはライブラリの展開を作成する目的で、複数のアセンブリを実際にマージできることに注意してください。このようにして、個別に配布またはバージョン管理される可能性のある複数のファイルに頭を悩ませることなく、複数のプロジェクト/アセンブリの分離の利点を保持できます。

于 2012-10-11T20:21:07.447 に答える