0

現在、Unity で Prism を使用して WPF アプリケーションに取り組んでいます。モデルの機能は、いくつかのクラス ライブラリ プロジェクトに分割されています。懸念事項のグループごとに、1 つの実装プロジェクトと、インターフェイスと列挙型のみで構成される 1 つのプロジェクトがあります。目標は、アプリケーション内の他のものに影響を与えたり、変更したりすることなく、実装 dll を変更または完全に置き換えることができるようにすることです。これが事実であるため、トップレベルのアプリケーションで両方へのハードリファレンスを使用せずに、インターフェイスを実装に登録する方法に少し固執しています。

どこかで一緒に参照する必要があることはわかっていますが、ブートストラップ内の最上位アプリでそれを行うのはベスト プラクティスに反しますか? この特定の問題については、Unity ではなく MEF を調べる必要がありますか?

4

1 に答える 1

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>();
   }
}
于 2011-01-05T16:07:10.870 に答える