2

通常の 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 コンテナーで自動的にまたはきれいに解決できないというだけですか?
4

2 に答える 2

1

1,2。抽象化の観点から、コンストラクターにホスト名を含めることは論理的であり、理想的な場所です。

3,4. 私の個人的な意見では、ユニティを介してホスト名を解決するのは少しやり過ぎですが、完全に可能です。より簡単なオプションは、これが Unity 構成であるインスタンスを作成し、以下のように標準の app/web.config からホスト名を抽出することです (MVC 実装)。

 container.RegisterType<IFtpUtility, FtpUtility>(
      new InjectionConstructor(ConfigurationManager.AppSettings["Hostname"]));

これにより、物事がうまく分離され、必要に応じてその設定を構成できます。

于 2012-12-12T15:53:18.800 に答える
1

直接解決する代わりに、次の定義で をIFtpUtility解決できます。IFtpUtilityFactory

interface IFtpUtilityFactory
{
    IFtpUtility Create(string logicalHost);
}

特定の FTP ユーティリティ実装には、対応するファクトリ実装があります。これは事実上、汎用インターフェイスを備えた代理コンストラクターであり、解決時間より後に必要なパラメーターを提供できます。

于 2012-12-12T15:53:23.357 に答える