2011-01-04 7 views
0

私は現在、Prism with Unityを使用しているWPFアプリケーションで作業しています。モデルの機能はいくつかのクラスライブラリプロジェクトに分割されています。懸念の各グループについて、私は1つの実装プロジェクトと、1つのインタフェースとenumのみからなる1つのプロジェクトを持っています。目標は、アプリケーション内の他のものに影響を与えたり、変更したりすることなく、インプリメンテーションdllを変更または完全に置き換えることができるようにすることです。この場合、私はトップレベルのアプリケーションの両方へのハードリファレンスなしで、実装にインターフェイスを登録する方法についてちょっと固執しています。別個のアセンブリでインターフェイスと実装を使用する場合、UnityがPrism WPFアプリケーションで2つをマップする必要はありますか?

どこかで一緒に参照する必要があることは知っていますが、ブートストラップのトップレベルのアプリでそのようなことが起こるのはベストプラクティスに反するのでしょうか?私は代わりに、この特定の問題のためにUnityよりMEFを探しているべきですか?

+0

あなたは離れてその機能を分割して例のモデルを提供することができますか? – Jon

+0

アプリケーションは、スクリプト化されたUI自動化のためのプレーヤーとして機能することです。私は、私たちが自動化したいUI項目用のインターフェースと、自動化を実装する別のプロジェクトを含んでいるプロジェクトを持っています。基本設定は次のとおりです:Scripting.ComponentModel - Scripting - UIAutomation.ComponentModel - UIAutomation - Etc. 私はプリズムモジュールを考慮しましたが、それらはUI Compositionのためのものとして私を襲います。私はサービスレイヤーを州と抽象的ないくつかの詳細を提供すると考えていましたが、多くの場合、複雑さを増すだけで多くの価値を追加することはありません。 – Mike

答えて

0

通常、実装を含むモジュールでこれを行います。 Unityコンテナは、モジュールのコンストラクタで依存関係注入を使用して提供されます。したがって、シェルは実際にインターフェイスに実装を登録する必要はありません。インターフェイスを含むモジュールは、通常はインフラストラクチャDLLであり、モジュールではないため、実装モジュールによって参照されることがあります。

これは、DLL間のインターフェイス/実装の分離に関するPrismの推奨事項に沿っていることに注意してください。彼らはサービスに関してある程度深く入ります。私はあなたがモデルや他のオブジェクトのためにそれを使用するそれらの例を見つけることは疑いがあります。

例:

using Microsoft.Practices.Unity; 
using YourInfrastructureDll; 

public sealed class ModuleImplementationA : IModule 
{ 
    private readonly IUnityContainer _container; 

    public ModuleImplementationA(IUnityContainer container) 
    { 
     _container = container; 
    } 

    public void Initialize() 
    { 
     // IYourInterface is defined in the Infrastructure DLL, while YourImplementationA exists in this module 
     _container.RegisterType<IYourInterface, YourImplementationA>(); 
    } 
} 

これは、別の実装のDLLをスワップアウトすることができます。

using Microsoft.Practices.Unity; 
using YourInfrastructureDll; 

public sealed class ModuleImplementationB : IModule 
{ 
    private readonly IUnityContainer _container; 

    public ModuleImplementationB(IUnityContainer container) 
    { 
     _container = container; 
    } 

    public void Initialize() 
    { 
     // IYourInterface is defined in the Infrastructure DLL, while YourImplementationB exists in a different module than the first 
     _container.RegisterType<IYourInterface, YourImplementationB>(); 
    } 
} 
+0

モジュールの使用についての私の理解は、おそらくオフだったでしょう。私が見たほとんどの例は、私がモジュールを信じるようになった地域マネージャを注入するのは、UI Compositionのものでした。おかげで – Mike

+0

モジュールは、UIの構成のためにすることができますが、彼らはまた、何でもすることができます。プリズムについての素晴らしい点の1つは、それがあなたに課されないということです。データアクセスレイヤーにはインフラストラクチャで定義されたサービスがモジュール内に実装されている場合があります(おそらくOracle用、SQL Server用など)。ビジネスロジックを実行するモジュールにも同じことが適用できます。それはアプリケーションによって異なります。 –

関連する問題