1

次のコードを検討してください-

namespace N1
{
    class A
    {
        //some implementation
    }
    class B
    {
        //some implemntation
    }
}

namespace N2
{
    class A
    {
        //slightly different implementation
    }
    class B
    {
        //slightly different implementation
    }    
}

明らかに、両方のアセンブリを一緒に使用することはできません-

そして、解決策は、完全修飾クラス名を使用することです。N1名前空間クラスを使用する数千行のコードをリファクタリングする場合。N1を使用するか、N2を使用するかは、プロセスの開始時に1回決定されます。

C++の条件付きコンパイル機能よりも少し高度なもの

#ifdef debug
#include <N1.h>
#elif
#include <N2.h>
#endif

不可能に聞こえたら申し訳ありませんが、私の好奇心から、それは可能だろうかと思います-

if (...)
    {
        using N1; 
    }
else
    {
        using N2;
    }
4

2 に答える 2

2

私があなたが欲しいと思うのは、インターフェースとIoCコンテナ/ファクトリです。

すべてのメソッドのインターフェースを作成し、とを参照する別のアセンブリで提供しAます。これらのインターフェイスを両方のアセンブリに実装します。次に、実行時に正しい実装を解決するIoCコンテナを接続します。BN1N2

于 2012-09-17T16:43:33.530 に答える
2

ただし、説明しているベースのusingアプローチは機能しません。「名前空間の使用」は実際には単なるコンパイル時の構成であるため、実行時の動作には影響しません。実行時には、完全修飾型が使用されます。

これを処理するための一般的なアプローチの1つは、 MEFなどのライブラリを介してIoCの形式を使用することです。

両方の名前空間の型を同じ基本クラスから派生させるか、同じインターフェイスを実装する場合[Export]、2つの別々のアセンブリから型を作成できます。構成するアセンブリの決定は、実行時に行うことができます。これにより[Import]、必要に応じて入力できるようになり、適切な型を取得できます。

于 2012-09-17T16:43:38.863 に答える