FooControllerというクラスがあり、その中にIBar(インターフェイス)タイプのBarというプロパティがあるとします。MEFを介してBarを初期化する必要があります。ただし、MEFは、アプリケーションの期間中にIBarタイプのインスタンスを1つだけ作成し(複数の要求のために初期化するために複数の呼び出しがあるにもかかわらず)、すべての要求で同時に使用できるようにする必要があります。IBarの実装はスレッドセーフであると見なすことができることに注意してください。
すなわち
public interface IBar
{
string Method();
}
[Export(typeof(IBar))]
public class MyBar: IBar
{
public string dateTimeCreated;
public MyBar()
{
System.Threading.Thread.Sleep(1000);
dateTimeCreated = DateTime.Now.ToLongTimeString() + " ";
}
public string Method()
{
return dateTimeCreated;
}
}
public class FooController : ApiController
{
[Import(typeof(IBar), RequiredCreationPolicy = CreationPolicy.Shared)]
public IBar Bar { get; set; }
public FooController()
{
//Assume CompositionContainer.ComposeParts call here
}
public string Get()
{
return Bar.Method();
}
}
問題は、FooControllerでGet()を呼び出すたびに、返される時間の値が変わることです。これは、MyBarオブジェクトが呼び出しごとに再インスタンス化されていることを意味します。基本的に同じ値を返す必要があります。つまり、複数のリクエストがあるにもかかわらず、アプリケーションでIBarのインスタンスを1つだけ作成するようにMEFに指示する必要があります。
前もって感謝します。