2011-09-21 10 views
0

例:のStructureMap - 実行時にアセンブリを交換する能力

コンソールアプリケーション:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var calculator = ObjectFactory.GetInstance<ICalculator>(); 
     for (var i = 0; i < 10; i++) 
     { 
      Console.WriteLine(calculator.Calculate(10, 5)); 
      Console.ReadLine(); 
     } 
     Console.ReadLine(); 
    } 
} 

総会 "インタフェース":

public interface ICalculator 
{ 
    int Calculate(int a, int b); 
} 

アセンブリ "Implemenation":

internal class Calculator : ICalculator 
{ 
    public int Calculate(int a, int b) 
    { 
     return a + b; 
    } 
} 

アセンBLY「Implemenation」、このアセンブリは、実行時に上記のアセンブリを交換しなければならない。

internal class Calculator : ICalculator 
{ 
    public int Calculate(int a, int b) 
    { 
     return a * b; 
    } 
} 

総会「リゾルバ」

For<ICalculator>().Use<Calculator>(); 

私は、実行時に具体的な実装を置き換えたいです。これは、古いアセンブリ "Implementation"を置き換えるUpdateServiceによって行うことができます。

問題は、アセンブリ「実装」がロックされていることです。私はそれを置き換えることはできません。

これを達成するためには何が必要ですか?

IoCコンテナが自分の要件を担当しているか、独自のインフラストラクチャを構築する必要がありますか?

EDIT:Web環境で

あなたは簡単にアセンブリを交換することができます。私はこれをすでに成功させました。

+0

なぜ-1?コメントを控えてくれてありがとう! – Rookian

+0

実行時にアセンブリを置き換えることによって解決しようとしている問題(または置き換えるレジストレーションのセット)を説明できますか? – Steven

+0

私はそれを閉じて私のアプリケーションを更新する可能性を持っていたいです。つまり、バグがあったのでDALを更新したいのですが、アプリケーションをまだ実行しておく必要があります。 – Rookian

答えて

0

私は、これはあなたが探しているものがあると思います:

http://structuremap.net/structuremap/ChangingConfigurationAtRuntime.htm

+0

設定を変更したくありません。私は実際に実行時にアセンブリを置き換えたいだけです。実行時にアセンブリをコピーして貼り付けるだけでオーバーライドできます。 – Rookian

+0

アセンブリがメモリにロードされ、実行時にロックされていますが、アセンブリを置き換えるまでのオプションはありません。ハードドライブ上のバージョンは、既にロードされてメモリから実行されているため、問題はありません。 –

2

私はあなたが唯一の追加のアセンブリをロードすることができます怖いです。

MSDNから:

それが含まれているアプリケーションドメインのすべて をアンロードすることなく、個々のアセンブリをアンロードする方法はありません。アセンブリが を範囲外にしても、実際のアセンブリファイルは、それを含むすべての アプリケーションドメインがアンロードされるまで、ロードされたままです。

+0

私の知っている限りでプレーするIISのため、私の説明したWebシナリオが機能します。 – Rookian

関連する問題