これはあなたが聞きたがる答えではありませんが、しないでください。
そのコンストラクターをprivate/internal/protected
作成すると、アルゴリズムのテストが難しくなり、API のコンシューマーがファクトリを使用する代わりに独自の実装を手動で選択することもできなくなります。
コンストラクターを公開したままにして、必要なすべての依存関係がコンストラクターで宣言されていることを確認してください。コンストラクターのさまざまな修飾子に関する私の見解は次のとおりです。
public
- 誰もがコンストラクターにアクセスでき、クラスをテストできます -これは良いことです。
protected
- サブクラスはコンストラクターにアクセスできます。これは問題ありませんが、実際には抽象クラスおよび/またはコンストラクターの連鎖にのみ使用されます。
internal
InternalsVisibleTo
- コンストラクターの使用を(フレンド) アセンブリに制限しています。これは、アセンブリ内の誰でも通常どおりに構築できることを意味しますが、他のアセンブリはファクトリを明示的に使用するかInternalsVisibleTo
強制的に使用する必要があり、それによってアルゴリズムをファクトリに結合します。
private
- デフォルトのコンストラクターを非表示にする場合 (ただし、少なくとも 1 つの引数を使用してコンストラクターを作成する場合はこれを行う必要はありません)、または連鎖可能なコンストラクターのみを作成する場合に便利です。
TL;DR -コンストラクター internal
を作成しないことをお勧めします。そうすることで、クラスを作成することもできます internal
(クラスではなく、インターフェイスによってアルゴリズムを参照していますよね?)
別の解決策は、クラスの実装を作成し、private
それらを Factory 内にネストすることです。それらすべてに共通のインターフェースを実装させ(すでに行っているはずです)、そのインターフェースをアプリケーションの残りの部分に公開します。それでも、テストが困難になるという問題は回避できません。