7

通常のASP.NET MVCページでは、リポジトリはコントロールのコンストラクタに渡されます。次に、テストでは、モックリポジトリを通過するコントローラをインスタンス化できます。ASP.NET Webサービスでdependency injectionとリポジトリパターンを使用するにはどうすればいいですか?

どのようにWebサービスでこれを行うことができますか?私が見る問題は、ControllerBuilder.SetControllerFactoryに相当するものがないことです。

IoCフレームワーク(Castle)が正しいリポジトリ実装でWebサービスをインスタンス化するためのベストプラクティスは何ですか?

私は、HttpHandlerを拡張し、Webサービスが実際にインスタンス化される方法を変更する方法があると思っていました。私は、これがMVCフレームワークの仕組みだと信じています。

+0

Webサービスを実装するために使用しているテクノロジーはどれですか? ASP.NET WebサービスまたはWindows Communication Foundation? –

+0

ASP.NET Webサービス。しかし、jristaの答えを読んだ後、本当に依存関係を入れたいのであればWCFを調べる価値があるかもしれないと思います。私はちょうど2つのコンストラクタを持っていると考えています - リポジトリをパラメータとして(テストはこれを呼び出す)、そしてハードコードするデフォルトのもの(この新しいIRepository)はASP.NETフレームワークによって呼び出されます。 –

答えて

1

私はあなたが城ウィンザーWCFの統合施設を探していると信じて:あなたは、WCFを使用している場合、私はこれを書きました。 Windsor IOCを使用して、サービス実装の構築プロセスを引き継ぐServiceHost実装を提供します。あなたは、便利に十分なこの機能を使用して、他のIoCのアプリのような依存関係を注入し、できる城プロジェクトのその一部:城プロジェクトのバージョンはあなたがすることが必要なものを行っていない場合は、私が持っている

http://www.castleproject.org/container/facilities/trunk/wcf/index.html

城のプロジェクトのバージョンを見つける前に私がウィンザーのために同じことをするために作った自分の施設。どちらも一般的に同じことをしますが、どちらも問題に少しずつ違っています。

+0

私は答えは "ASP.NET Webサービスでコンストラクタインジェクションを使うことはできません"だから、BuildUp(this)を使うか、castleとWCFを使うかのどちらかです。 –

+1

実際には、Castle WindsorをASMXスタイルのサービス(それが意味するものなら)と併用することができます。私はあなたがWCFについて質問していると思っていましたが、なぜWindsorをASMXパイプラインに統合できないのか分かりません。 WCFほど簡単ではないかもしれませんが、不可能ではありません。 – jrista

+0

@jrista ServiceHostはasmxファイルでは使用できないので、asmxサービス用にDIを実装する方法の例はありますか? – Nobody

2

これは良い質問です。私は同じ問題を抱えています。 .asmxファイルを使用してWebサービスを作成する場合、コンストラクタインジェクションを使用することは不可能です。 Webサービスを実装するためにWCFを使用していた場合は、可能であると思います。

私の.asmx Webサービスでは、DIコンテナにプロパティを設定して依存関係を設定させました。私のアプリケーションはWebフォームasp.netアプリケーションでもあるので、Webフォーム上でコンストラクタインジェクションを使用することができないので、どうやってやるのですか。しかし、私はStructureMapを使用していて、既に作成されたオブジェクトのプロパティを設定できるBuildUp関数を持っています。コンストラクタインジェクションほどきれいではなく、良い妥協点です。

しかし、Application_PostMapRequestHandlerイベントでは、Webフォームの外側にビルドアップを配置できるため、WebサービスはWebフォームとは区別されます。しかし、私はWebサービスクラスが作成された後にトリガーされるイベントを発見していません。したがって、私のWebサービスのコンストラクタでは、私は次のコードを持っています

ObjectFactory.BuildUp(this); 

これはアンチパターンです。 DIコンテナによって初期化されるクラスは、DIコンテナ自体を知ってはいけません。しかし、私はまだ良い解決策を見つけていません。

0

基本クラスを定義し、そこにプロパティインジェクションを使用します。 Peteはすでにそれを言ったが、あなたはそうするだろう:ObjectFactory.BuildUp(this);

違いは、Webサービスの基本クラスに置いて、特定の実装のための "自動"です。

これはその1行ですので、実行時にDIコンテナを切り替える必要がある場合を除いては気にしません(可能性は低い)。それでも必要な場合は、特定のDIコンテナを使用する別のクラスにコールを移動してください。

0

目的のコンストラクタでカスタムクラスを作成してから、そのクラスのオブジェクトをasmxでインスタンス化してから、そのオブジェクトにすべてのアクションを委譲することはできません。

私は通常、このようなオブジェクトのそれらの種類の作成:

var o = CustomClass.Create(); 

public class CustomClass 
{ 
    public static CustomClass Create() 
    { 
    return IoC.Resolve<CustomClass>(); 
    } 
} 

public static class IoC 
{ 
    public T Resolve<T>() 
    { 
    return yourStaticReferenceToPreferredContainer.Resolve<T>(); 
    } 
} 
関連する問題