15

現在、依存性注入コンテナーを少し試しています。今回は Unity を使用しています。

次のインターフェースがあるとします。

public interface IPodcastCommService
{
    void Download();

    void Upload();
}

および次の実装:

public class PodcastService
{
     private IPodcastCommService commservice;
     private String url;

     public PodcastService(String url, IPodcastCommService commservice)
     {
         this.commservice = commservice;
         this.url = url;
     }
}

コンストラクターのため、パラメーターを渡すための解決策を探していたところ、次のように見つかりました。

var p = container.Resolve<IPodcastCommService>(new ParameterOverride("url", myUrl));

これまでのところとても良いですが、同時に、これがどれほど悪いか、クラスの設計がどれほど悪いかについて読みました。はい、少し醜いように見えます。しかし、エレガントな方法でパラメーターをクラスに渡すにはどうすればよいでしょうか?

私の最初の考えは、それをプロパティとして行うことでしたが、その後、Url が必要になるたびに、それが既に指定されていることを確認する必要があります。

更新: これが悪い設計であると私が読んだ一例は、これです:

ただし、解決操作のためにカスタム コンストラクター パラメーターを渡す場合があります。これは悪いアーキテクチャだと主張する人もいるかもしれませんが、DI コンテナをレガシー システムに持ち込むような状況では、この種のアクションが必要になる場合があります。

ソース: http://mikaelkoskinen.net/unity-passing-constructor-parameters-to-resolve/

4

4 に答える 4

1

Maybe a

container.RegisterType<PodcastService>(new InjectionConstructor("myUrlParameter"));

would do better, wouldn't it?

but if you need more then one podcastservice and they need another url, parameteroverride is ok I guess.

于 2013-05-06T18:18:01.370 に答える
-3

使用しているフレームワークによって異なります。たとえば、DependecyResolver などの IoC コンテナーの asp.net mvc プロバイダー統合ポイントです。オブジェクトを構築し、依存関係を注入するためのすべてのロジックをそこに配置する必要があります。aps.net を使用している場合、preinit eevnt が依存関係を挿入する何らかの種類のベース ページがある可能性があります。asp.net でコンストラクター注入を使用することはできません。プロパティ注入のみです。winforms を使用すると、ある種のフォーム ファクトリを使用してフォーム オブジェクトを構築できます。

于 2013-05-06T08:51:14.527 に答える