我有两个程序集:
部件1:
interface IWeapon {
int Might { get; }
}
[Export("sword")]
public class Sword : IWeapon {
public int Might {
get { return 10; }
}
}组件2:
interface IWeapon {
int Might { get; }
}
var catalog = new AssemblyCatalog(typeof(Ninja.Sword).Assembly);
var container = new CompositionContainer(catalog);
// not allowed to use the IWeapon def in assembly 2
var sword = container.GetExportedValue<IWeapon>("sword");我知道怎么让它起作用。我可以向MEF (Managed Extensibility Framework)请求对象,或者让它导出正确的IWeapon,而不仅仅是按名称导出对象。
如果所有的接口点都实现了,那么MEF是否可以为我执行“鸭子”类型并返回一个代理对象?
发布于 2009-07-17 00:36:55
我认为它在MEF的早期版本中就有(通过为类动态发出IL并返回它),现在它被删除了。这真的说不通。毕竟,您的类应该设计为通过特定接口实现该加载项功能。如果你能给它们添加像Export属性这样的东西,你也应该能够很好地在你的类上实现接口。
发布于 2012-04-15 04:20:04
如果你的两个IWeapon类都有相同的COM Guid,那么你可以在MEF 4中使用类型等价来接近鸭子类型。它对于.NET插件的版本控制和升级支持真的很好,比如有一个v2契约,它也可以加载只实现v1的插件。这里有一篇关于这个主题的好文章。
http://blogs.msdn.com/b/delay/archive/2011/03/09/mef-addict-combining-net-4-s-type-embedding-and-mef-to-enable-a-smooth-upgrade-story-for-applications-and-their-extensions.aspx
https://stackoverflow.com/questions/1140983
复制相似问题