通常の FTP 処理を担当する FTP ユーティリティがあります: put file、get file などです。インフラストラクチャの一部として、IConfiguration インターフェイスを実装するコンポーネントから構成を取得し、コンポーネントを実装するコンポーネントにエントリを記録するコンポーネントが必要です。 ILogger インターフェイス。ftp ホストは、ホスト名、ユーザー ID、およびパスワードを含む構成ファイル内のセクションに一致する logicalHost 名 (someFtpSite など) によって記述されることに注意してください。したがって、私のインターフェースとクラス定義は次のように作成されました。
public interface IFtpUtility
{
void PutFile(string sourceFileAndPath, string targetFileAndPath, string logicalHost);
}
public class FtpUtility : IFtpUtility
{
private readonly IConfiguration _configuration;
private readonly ILogger _logger;
public FtpUtility(ILogger logger, IConfiguration configuration)
{
_configuration = configuration;
_logger = logger;
}
// IFtpUtility implementation follows
}
この署名の意図は、アクション (PutFile など) が必要な場合に logicalHost 名のみを要求することでした。したがって、PutFile メソッド自体でそれをプロビジョニングします。
このレイアウトは、Unity のような IoC コンテナーで使用するのに非常に適しています。次のコードがあります。
UnityContainer = new UnityContainer();
UnityContainer.RegisterType<IConfiguration, ConfigurationProvider>();
UnityContainer.RegisterType<ILogger, LoggingProvider>();
UnityContainer.RegisterType<IFtpUtility, FtpUtility>();
後で FtpUtility を使用する必要が生じたときは、適切な解決のためにコンテナーに依存していました。
IFtpUtility ftpUtility = UnityContainer.Resolve<FtpUtility>();
ここで、同僚から、logicalHost 名をコンストラクターのパラメーターにする必要があると提案されました。これがないと、どの関数も実行できず、多かれ少なかれ FtpUtility の特定のインスタンスに関連付けられているためです。呼び出しごとに 1 つの FTP サーバーとのみ通信します。そのため、コンストラクターに logicalHost 名を含めるように喜んで変更したため、IoC コンテナーの解決が壊れました。IConfiguration と ILogger は特定の実装に関連付けることができますが、logicalHost はインスタンスに固有であり、インスタンスが作成されるまではわかりません。このような変更は IoC コンテナーの使用方法を変更するため、実装できないなどと主張することができますが、これは議論が弱すぎます (私は見つけました)。だからここに質問があります:
- アーキテクチャの観点から、コンストラクターに logicalHost を配置することは良いことですか?
- logicalHost 名は、FtpUtility が機能しない必須の構築パラメータであり、コンストラクタの一部である必要がありますか?
- Unityでこれを解決する方法はありますか? コンストラクターに logicalHost の 3 番目のパラメーターが含まれている場合、事前にコンテナーに登録するのではなく、解決時に 3 番目のパラメーターの値を指定できるようにする Resolve<>() へのオーバーロードはありますか?
- 問題がないのに問題を解決しようとしていますか? この状況で IoC コンテナーを使用するのはやり過ぎであり、問題を複雑にするのではなく、助けになるのでしょうか? 結局のところ、私はまだ IoC パターンを使用しています - IoC コンテナーで自動的にまたはきれいに解決できないというだけですか?