2

このスタックオーバーフローの質問で、 Prism / Unityは思ったほど分離されていないことを学びました。たとえば、menuManagerをコンストラクターに注入するこのクラスがある場合、このクラスが実際にどこかに存在することを確認する必要があります(クラスを含む.dllをプルするだけで、コンテナがそれを処理します。たとえば、その場所にnullを挿入します):

public class EmployeesPresenter
{
    public EmployeesPresenter(IMenuManager menuManager)
    {

    }
}

しかし、私はそれに対処することができます:アプリケーションはMenuModuleなしでは実行できません(または、提案されたように、アプリケーションが壊れないようにするだけのNullMenuModuleを持つことができます)。

ただし、私が構築しているアプリケーションでは、MenuModuleにMenuManagerクラスがあり、すべてのモジュールは、メニューに必要なすべてのものをMenuManagerに登録する必要があります。ただし、 MenuModuleを交換できるようにしたいです。たとえば、InfragisticsMenuModuleTelerikMenuModuleなどがあります。

ただし、CustomersModuleなどにいる場合、TelerikMenuModuleを使用するには、それを参照する必要があります。また、InfragisticsMenuModuleを使用する場合は、それを参照する必要があります。

では、すべてのモジュールを新しい参照で再コンパイルせずに、TelerikMenuModuleをInfragisticsMenuModuleと「ホットスワップ」するにはどうすればよいでしょうか。たとえば、これを置き換えたい場合は次のようになります。

Application.exe
Customers.dll
TelerikMenuModule.dll

これとともに:

Application.exe
Customers.dll
InfragisticsMenuModule.dll

アプリケーションを再起動するだけで、新しいInfragisticsMenuModule.dllで実行され、TelerikMenuModule.dllが存在しなくなったことを通知しません

4

2 に答える 2

5

これがインターフェースの出番です。次のようなものが必要です。

public interface IMenuSystem
{
    // whatever operations need to be offered by a menu system
}

Application.exeCustomers.dllそのインターフェースのみを参照する場合があります。彼らは特定の実装について知ることを許可されていません。

次に、構成手順(Register...メソッドの呼び出しまたは構成ファイルの使用)を使用して、の実装を提供するタイプを指定しますMenuSystem

于 2009-07-20T15:41:32.327 に答える
2

明らかな理由で、MEFはここで頭に浮かび、このようなもののために設計されています。Unityを使用する機会がなかったので、このようなものが組み込まれているかどうかはわかりません(つまり、IMenuModule実装のディレクトリをスキャンします)が、MEFはこれを実行できます。

このIMenuModuleを(他のアセンブリとは別に)共通のアセンブリに配置することもお勧めします。私は通常これをSomething.Core.dllと呼んでいます。

つまり、Application.exe、Customer.dll、Application.Core.dll、および特定のMenuModule実装があります。

特定のMenuModule実装は、Application.Coreアセンブリを参照して、そのIMenuModuleインターフェイスにアクセスし、そこに実装します。

于 2009-07-20T15:45:27.450 に答える