1

IBackendバックエンドと通信するためのインターフェースを使用するアプリケーションがあります。ProdBackend : IBackend本番環境では、インターフェイスの実装としてクラスを使用したいと考えています。テスト環境で使用したいTestBackend : IBackend.

アプリケーションは zip ファイルにパッケージ化されます。このファイルは、本番環境またはテスト環境にデプロイされるかどうかに関係なくする必要があります。

IBackendデプロイされている環境に応じて、アプリケーションで異なる実装を使用するにはどうすればよいですか?

2 つの環境に異なる .dll をインストールし、クラスに同じ名前を付けるだけで、これを行うことはできますか?

UPDATE 11:12 - 15/1 : パッケージ化されたアプリケーションには、prod 実装を含めることは許可されていませんProdBackend : IBackendProdBackend : IBackendしたがって、アプリケーションはコンパイル時に認識しません。

4

4 に答える 4

1

セットアップに応じて、これを行うには多くの方法があります。私はこれらを考えることができます:

  1. マシン名: テスト サーバーのサーバー名 (または規則) がわかっている場合は、に基づいて依存関係を新しくすることができますEnvirnoment.MachineName
  2. プラグイン:プラグイン モデルを使用する場合 ( と を含むアセンブリを構築するProdBackendことTestBackendにより、アプリケーションを展開するときに決定を下すことができます。IOC コンテナーが依存関係を結び付けるために使用するプラグイン ディレクトリを用意することで、これを行うことができます (または他の手段)。
  3. 構成:構成ファイルの値を使用して環境を決定し、その情報を使用して 2 つの実装を選択できます。次に、本番環境にデプロイするときに、app.configそれに応じて構成ファイル ( ) を調整できます。
于 2013-01-15T10:07:58.693 に答える
0

Contextual Bindingという概念があります。これは、ほぼすべての依存性注入コンテナーによって実装されます。実際には、これはバインディングに条件を追加できることを意味します。を使用した例です

「本番」環境条件の定義

たとえば、Environment.MachineName、またはあなたに適した他のもの:

private static readonly Func<bool> IsCurrentEnvironmentProduction = 
   () => Environment.MachineName == "Production.Server";

さまざまな環境のバインディングを定義する

public static IKernel InitializeKernel() 
{ 
    var kernel = new StandardKernel();

    // binding for production
    kernel
        .Bind<IBackend>()
        .To<ProdBackend>()
        .When(request => IsCurrentEnvironmentProduction());

    // binding for test environment
    kernel
        .Bind<IBackend>()
        .To<TestBackend>()
        .When(request => !IsCurrentEnvironmentProduction());

    return kernel; 
}

環境に依存するインスタンスを解決する

DIコンテナがすべてを行います

var backend = kernel.Get<IBackend>();

完全なサンプルはこちらから入手できます

モノについてのコメント

Ninject のダウンロードによると、Mono のリリースがありますが、他の DI コンテナーにも同じ機能を実装できます。

于 2013-01-15T12:49:30.090 に答える
0

テスト環境の全体的なポイントは、何かを本番環境にデプロイするときに、それが適切に機能することを可能な限り合理的に確信できるようにすることです。テストで実行される一連のコードと、本番環境へのデプロイ時に実行される別のコード セットがある場合、その目標をどのように達成していますか?

基本的に、コードの観点から見たテストと本番の違いは、構成のみにする必要があります (データベース接続の違い、テストでのより詳細なログ記録など)。そうしないと、基本的に、テストされていないコードを本番環境にデプロイすることになります。これは、私の意見では、起こりうる災害の種をまきます。

于 2013-01-15T11:25:09.183 に答える
0

同じインターフェイスの異なる実装で異なる DLL を提供すると、問題なく動作します。

より洗練された解決策は、これを行うことですが、必要な実装を提供する Service Locator を追加することです。次に、実行しているプラ​​ットフォームに基づいて実装を返すように Service Locator を構成できます。

サービス ロケーターは数多くありますが、Mono でサポートされているすべてのプラットフォームで実行される単純なものはTinyIOC です。

于 2013-01-15T10:13:45.180 に答える