ニーズ -
- 同じインターフェースの共有エクスポートを宣言するため。エクスポートは一意のエクスポート名でマークされているため、消費者はエクスポートの特定のフレーバーをインポートできます。
- クラスの共通インスタンスをオブジェクトのセットに注入するが、オブジェクトのセット間で共通のインスタンスを共有しない [これにより、異なるキーを使用して共有エクスポートを使用するようになります - オブジェクトの 1 つのセットは、共有インポートを満たすために単一のキーを使用できます。必要]
これがエクスポートクラスです
public interface IMyExport
{
void Display();
}
public class MyExport : IMyExport
{
private Guid _id = Guid.NewGuid();
public void Display()
{
Console.WriteLine("Instance ID = "+_id);
}
}
クラスのインスタンスをエクスポートする方法は次のとおりです
public static class ExportInitialization
{
[Export("Type A", typeof(IMyExport)),
Export("Type B", typeof(IMyExport))]
public static IMyExport IceCreamExport
{
get
{
return new MyExport();
}
}
}
消費者は、次の方法で特定のインスタンスをインポートできます
[Export]
public class ImporterA
{
private readonly IMyExport _myExport;
[ImportingConstructor]
public ImporterA([Import("Type A")]IMyExport myExport)
{
_myExport = myExport;
}
public void Display()
{
_myExport.Display();
}
}
[Export]
public class ImporterB
{
private readonly IMyExport _myExport;
[ImportingConstructor]
public ImporterB([Import("Type B")]IMyExport myExport)
{
_myExport = myExport;
}
public void Display()
{
_myExport.Display();
}
}
class Program
{
[Import]
public ImporterA ImporterA { get; set; }
[Import]
public ImporterB ImporterB { get; set; }
static void Main(string[] args)
{
new Program().Run();
}
public void Run()
{
var container = new CompositionContainer(new AssemblyCatalog(Assembly.GetExecutingAssembly()));
container.ComposeParts(this);
ImporterA.Display();
ImporterB.Display();
Console.ReadKey();
}
}
これは以前は.Net 4.0で正常に機能していましたが、.Net 4.5がインストールされている場合、次の出力が得られます
Instance ID = 78bba41a-0c48-44fc-ae69-f0ead96371f9
Instance ID = 78bba41a-0c48-44fc-ae69-f0ead96371f9
オブジェクトの同じインスタンスが両方のインポートで返されることに注意してください。静的プロパティを介したエクスポートに関する文書化されていない規則に違反していますか?