IIS でホストされている WCF サービスがあります。このソリューションは、Service と Data の 2 つのプロジェクトで構成されています。サービスは次のようにデータに依存します。
Service -> Data
次のように、依存関係を逆転させようとしています。
Service <- Data
WCF サービス コンストラクターは (既定で) パラメーターを使用しない必要があるため、WCF を使用する場合、これはかなりの頭痛の種です。
Ninject とその WCF 拡張機能を使用して依存関係を挿入できると聞いたので、それを自分のソリューションに統合しようとしましたが、関連するファイルと参照をどのプロジェクトに置くべきかまだわかりませんか? 私がしたことは:
- NuGet を使用して Ninject をダウンロードする
- データ プロジェクトとサービス プロジェクトの両方に Ninject を追加します (これにより、サービス プロジェクトの App_Start フォルダーに NinjectWebCommon ファイルが作成されます)。
- サービス プロジェクトで IDataProxy インターフェイスを作成する
- データ プロジェクトにインターフェイスを実装する
- IDataProxy 引数を WCF サービス コンストラクターに追加する
- .svc ファイル マークアップに工場出荷時の設定を追加
その時点まで、私はそれを正しく行っていると確信しています。今不安定な部分:
このコードを使用して、データ プロジェクトにDataInjectionModule を作成しました。
namespace Data { public class DataInjectionModule : NinjectModule { public override void Load() { Bind<IResolutionRoot>().ToConstant(Kernel); Bind<ServiceHost>().To<NinjectServiceHost>(); Bind<IDataProxy>().To<DataProxy>(); } } }
私は最終的に、NinjectWebCommonファイル(確かに両方のプロジェクトの)にサービスを登録しようとしました:
/// <summary> /// Load your modules or register your services here! /// </summary> /// <param name="kernel">The kernel.</param> private static void RegisterServices(IKernel kernel) { kernel.Bind<IService>().To<Service>() .WithConstructorArgument("IDataProxy", context => context.Kernel.Get<IDataProxy>()); }
サービスを開始しようとすると、次のようになります。
指定されたサービス タイプは、デフォルト (パラメーターなし) のコンストラクターを持たないため、サービスとして読み込むことができませんでした。この問題を解決するには、既定のコンストラクターを型に追加するか、型のインスタンスをホストに渡します。
問題は、DataInjectionModule をカーネルにバインドしなかったことにあると感じていますが、バインドしようとすると、Service から Data への依存関係を追加する必要があります。これは回避しようとしていることです。
一般的な専門家のアドバイスをいただければ幸いです。ありがとう。