【发布时间】:2011-08-18 11:43:04
【问题描述】:
原始源代码
我的 BusinessObjects.dll 文件中有一个简单的业务对象:
namespace BusinessObjects
{
public class MyClass
{
public MyClass()
{
DateTime = DateTime.Now;
}
public DateTime DateTime { get; set; }
}
}
在我的 SharedUI.dll 中,我有这个“上下文提供者”类,我用它来保存对当前选定的 MyClass 的引用 - 请记住这是一个简单的示例 :)...
namespace SharedUI
{
public class AppContext
{
[Export]
public MyClass SelectedMyClass { get; private set; }
public void SetupContext(MyClass myClass)
{
SelectedMyClass = myClass;
}
public static AppContext Context
{
get
{
if (context == null)
{
context = new AppContext();
}
return context;
}
}
private static AppContext context;
}
}
我的 MefTest.exe 有这个类:
namespace MefTest
{
public class Program
{
[Import]
public MyClass MyClass { get; set; }
private void Compose()
{
var ventSystem = new MyClass();
AppContext.Context.SetupContext(ventSystem);
var executingAssembly = new AssemblyCatalog(Assembly.GetExecutingAssembly());
var contextAssembly = new AssemblyCatalog(Assembly.LoadFile(string.Format(@"{0}\SharedUI.dll", Environment.CurrentDirectory)));
var catalog = new AggregateCatalog(executingAssembly, contextAssembly);
var container = new CompositionContainer(catalog);
container.ComposeParts(this);
}
private void Run()
{
Compose();
// MyClass is always null in the next line?
Console.WriteLine(MyClass.DateTime.ToString());
Console.ReadKey();
}
private static void Main(string[] args)
{
var p = new Program();
p.Run();
}
}
}
我是 MEF 菜鸟,所以请多多包涵 :)
根据 Daniel Plaisted 的建议更新源代码
MyClass 源是一样的...
SharedUI.dll 现在看起来像这样:
namespace SharedUI
{
[Export]
public class AppContext
{
[Export(typeof(MyClass))]
public MyClass SelectedMyClass { get; private set; }
public void SetupContext(MyClass myClass)
{
SelectedMyClass = myClass;
}
}
}
MefTest.exe 现在看起来像这样:
namespace MefTest
{
public class Program
{
[Import]
public MyClass MyClass { get; set; }
[Import]
public AppContext AppContext { get; set; }
private void Compose()
{
var executingAssembly = new AssemblyCatalog(Assembly.GetExecutingAssembly());
var contextAssembly = new AssemblyCatalog(Assembly.LoadFile(string.Format(@"{0}\SharedUI.dll", Environment.CurrentDirectory)));
var catalog = new AggregateCatalog(executingAssembly, contextAssembly);
var container = new CompositionContainer(catalog);
container.ComposeParts(this);
var myClass = new MyClass();
AppContext.SetupContext(myClass);
}
private void Run()
{
Compose();
// AppContext.SelectedMyClass is NOT null in the next line... which is good I guess :)
Console.WriteLine(AppContext.SelectedMyClass.DateTime.ToString());
// MyClass is always null in the next line?
Console.WriteLine(MyClass.DateTime.ToString());
Console.ReadKey();
}
private static void Main(string[] args)
{
var p = new Program();
p.Run();
}
}
}
我做错了什么,因为我无法让它工作?
【问题讨论】:
-
您是否确认它会将
GUI加载到AssemblyCatalog 中? -
@Jonas:“GUI”是什么意思?是包含 Program-class、AppContext-class 还是 MyClass-class...的项目?
-
对不起,我混淆了 2 个不同的 SO 问题 :) 我的意思是 AppContext 类。您是否验证过它是由 MEF 加载的?
-
@Jonas:我想是的。如果我从 AppContext 类中删除 Export-attribute,container.ComposeParts(this) 会引发异常:“未找到与约束匹配的有效导出 '((exportDefinition.ContractName == "BusinessObjects.MyClass")... "
标签: c# import export properties mef