介绍
类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");
}
}
}
问题
我希望 MEFSomeService
在组成其他部分时考虑服务定位器导出的部分(即),但不幸的是,这不起作用。
第一个案例
当我尝试获取导出的值时,ISomeService
会System.ComponentModel.Composition.ImportCardinalityMismatchException
告诉我没有具有此合同名称和所需类型标识 ( ConsoleApplication1.ISomeService
) 的导出。
第二种情况
如果我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
吗?