序章
クラスSessionModel
は、いくつかのサービスを提供するサービス ロケーターです (システム アーキテクチャについては後で詳しく説明しますが、今のところはそのようにする必要があります)。
コード
次のコード部分を短く、自己完結型で、正しい (コンパイル可能)、例 (SSCCE) になるように編集しました。
using System;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
namespace ConsoleApplication1
{
internal class Program
{
private static void Main(string[] args)
{
var sessionModel = new SessionModel(3);
// first case (see text down below):
var compositionContainer = new CompositionContainer();
// second case (see text down below):
//var typeCatalog = new TypeCatalog(typeof (SessionModel));
//var compositionContainer = new CompositionContainer(typeCatalog);
compositionContainer.ComposeExportedValue(sessionModel);
var someService = compositionContainer.GetExportedValue<ISomeService>();
someService.DoSomething();
}
}
public class SessionModel
{
private int AValue { get; set; }
[Export]
public ISomeService SomeService { get; private set; }
public SessionModel(int aValue)
{
AValue = aValue;
// of course, there is much more to do here in reality:
SomeService = new SomeService();
}
}
public interface ISomeService
{
void DoSomething();
}
public class SomeService : ISomeService
{
public void DoSomething()
{
Console.WriteLine("DoSomething called");
}
}
}
問題
他のパーツを構成するときに、サービス ロケーターによってエクスポートされたパーツ (つまり ) を MEF に考慮してもらいたいのですSomeService
が、残念ながらこれは機能しません。
最初のケース
エクスポートされた値を取得しようとすると、このコントラクト名と必要な型 ID ( ) を持つエクスポートが存在しないというメッセージがISomeService
表示されます。System.ComponentModel.Composition.ImportCardinalityMismatchException
ConsoleApplication1.ISomeService
2 番目のケース
CompositionContainer
例外を使用して作成するとTypeCatalog
、例外が少し異なります。これは、System.ComponentModel.Composition.CompositionException
MEF が を作成する方法を見つけられないことを示していますConsoleApplication1.SessionModel
(これは正しいことであり、私が自分で作成している理由です)。
追加情報
mefx
両方の場合について次のように述べています。
[Part] ConsoleApplication1.SessionModel from: DirectoryCatalog (Path=".")
[Export] ConsoleApplication1.SessionModel.SomeService (ContractName="ConsoleApplication1.ISomeService")
[Part] ConsoleApplication1.SessionModel from: AssemblyCatalog (Assembly="ConsoleApplication1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")
[Export] ConsoleApplication1.SessionModel.SomeService (ContractName="ConsoleApplication1.ISomeService")
どうすればいいですか?これは MEF で可能ですか、それとも Unity や StructureMap などを使用する必要がありますか? これは実装できますExportProvider
か?