2012-02-11 10 views
2

私はStackOverFlowに投稿した前の質問に続いて、私はPrismデスクトップアプリケーションに以下のプロジェクト構造を持っています。PrismデスクトップアプリケーションのUnity依存関係の解決

クラスライブラリApplication.Common - >これはすべて私のDTOと全く別のソリューションである私のWCFサービス層で定義されているサービス契約が含まれています。

モジュール:Application.Modules.ServicesModule - >ここで私はサービス参照の追加]を使用して、私のWCFの実装へのリンクを追加しました。初期化の方法は、以下のように見えるので、私もApplication.Commonアセンブリで定義されているIMyServiceContract私のタイプの実装を登録します - 最後に

public void Initialise() 
{ 
    _container.RegisterType<IMyService, MyServiceClient>(new InjectionConstructor()); 
} 

私は別のモジュールにApplication.Modules.FunctionalityModuleを持っている、これは定義されたコンストラクタを持っています

public FunctionalityModule(IMyService myService){} 

アプリケーションが実行時にFunctionalityModuleに依存関係を解決しようとすると、次のエラーが

を発生し、次のように10

通常、依存関係は登録されていないが、この場合、ServicesModuleにあることが分かっているため、このエラーが発生しています。これは異なるモジュールに登録することと関係していますか? PrismデスクトップアプリケーションでWCFサービスをサポートするためにプロジェクト構造をどのように実装できるかについて、他に提案はありますか?

おかげ

アレックス

編集: 私はサービス参照の追加]を使用しているとき、私は問題を抱えていた私のサービス契約を定義するための一般的なアセンブリを使用していたとして。 Add Service Referenceを使用すると、生成されたコードがメタデータを使用してクライアント側の型を作成することが分かります。これらは、共通アセンブリ内のシグネチャと同じシグネチャを持ちますが、異なるものです。私がCommon Assemblyで契約を使用できるようにするために、私はこのポストhttp://xaml.geek.nz/working-slightly-smarter-with-wcfからインスピレーションを受けました。これは正しい方向に私を始めましたが、コードをプロダクション環境にもっと適したものにする必要があります。

+0

あなたはServicesModuleがロードされていますか? FunctionalityModuleの前にロードされていますか? –

+0

はい、ServicesModuleのInitialiseをブレークポイントすると、確実にヒットします。また、ServicesModuleはBootstrapperのFunctionalityModuleの前にあるので、前にロードされていることを前提としています。 – lostinwpf

+0

ServicesModuleの_containerインスタンスはどこから来ますか?それはそのコンストラクタを通じて注入されているのか、モジュール内でインスタンス化されていますか? –

答えて

1

問題は、インターフェイスから実装タイプへの必要なマッピングが指定されていないことです。 (私はUnityContainerExtensionsを使用することを好む)。

unityContainer.RegisterType < IStudentSearchService, StudentSearchService >(); 

また、モジュールの依存関係を指定する必要があります。 FunctionalityModuleServicesModuleに依存しています。これがどのように達成されるかは、ModuleCatalogの作成方法によって異なります。 だからどちらか。 BootstrapperのCreateModuleCatalogmoduleCatalog.AddModuleに、IModulesModuleAttributeModuleDependencyAttributeに、DirectoryModuleCatalogを使用してください。

もちろん、UnityContainerはapp.configファイルで設定できます。

+0

私はマッピングを追加したと信じています。私が気付いたのは、ServiceReferenceを追加すると、マッピングのインターフェイス側が動作するためにApplication.Modules.ServicesModuleから来なければならないということです。 Application.Commonからのマッピングのインターフェイス側を取って、そこから取りたい場所で、実際のWCF実装でのインターフェイスとして定義されているものは、動作しません。 – lostinwpf

0

生成されたサービスプロキシクラスは部分クラスです。あなたはちょうどそれらがサービス参照があるプロジェクトでは、次のようなものを追加することで、共通のアセンブリにIMyServiceから継承させることができるかもしれません:

using Application.Common.IMyService; 

namespace Application.Modules.ServicesModule 
{ 
    public partial class MyServiceClient : Application.Common.IMyService 
    { 
    } 
} 
関連する問題