1

ここで自分自身を隅に追いやったと思います: 複数のプロジェクトで使用するコードがたくさんあるとしましょうCompany

次に、すべてのプロジェクト固有のコードが に入りCompany.Projectます。次に、名前空間を指定しなくてもプロジェクトの名前空間からライブラリ (外側の名前空間) のコードを呼び出すことができます。コードは暗黙的にインポートされます。罰金。

ただし、すべてのプロジェクトで使用しているが、プロジェクトごとに異なる方法で実装されているコードがあるとします。例として、WPF、Winforms、またはプロジェクトごとに異なるルック アンド フィールで実装できる診断ウィンドウとコードがあるとします。プロジェクトごとに実装されるため、名前空間に入ることができませんが、プロジェクトの名前空間にある場合は、プロジェクトごとに異なる内部名前空間を指定してCompany、名前空間からのみ呼び出すことができます。Company

これを解決するためにデリゲートを使用できると思いますが、面倒なようです - もっと簡単な方法はありますか?

4

2 に答える 2

4

多分インターフェースを使用しますか?Company名前空間でインターフェイスを定義します。次に、各プロジェクトにインターフェースを実装させます。次に、Company名前空間でインターフェイスを使用します。

このアプローチの欠点の 1 つは、インターフェイス実装のプロジェクト固有のインスタンスを作成するクラスがどこかに必要になることです。Company名前空間とそれを実装するプロジェクト固有のクラスの両方への参照が必要な、ある種のファクトリのように。

于 2013-09-23T19:02:53.277 に答える
1

ある種の IoC が必要で、インターフェイスを使用してこれを解決しているようです。これは、特別なライブラリを使用しない単純なものです。

// In your shared project
namespace Company {
    public interface IDiagnosticWindow {
        void ShowMessage(string message);
    }

    public static class Utilities {

        private static IDiagnosticWindow _diagnosticWindow;

        public static void InitializeDiagnosticWindow(IDiagnosticWindow dw) {
            _diagnosticWindow = dw;
        }

        public static void ShowMessage(string message) {
            _diagnosticWindow.ShowMessage(message);
        }
    }
}

// In your WinForms project
namespace Company.WinForms {
    public class WinFormsDiagnosticWindow : IDiagnosticWindow {
        public void ShowMessage(string message) {
            MessageBox.Show(message);
        }
    }

    static void Main() {
        Utilities.InitializeDiagnosticWindow(new WinFormsDiagnosticWindow());
    }
}

他のアプリケーションごとに同様に実装します。この例では、アプリの開始時にこれを手動で初期化することが重要です。しかし、これを で行うとMain、これが初期化Utilities.ShowMessageされ、コア プロジェクトまたはアプリケーション プロジェクトで使用できるようになります。

Ninject のようなライブラリも、この関係をもう少しうまく接続することで役立ちます。

于 2013-09-23T19:09:24.697 に答える