【问题标题】:How to use MEF to init a group of classes?如何使用 MEF 初始化一组类?
【发布时间】:2010-12-02 14:57:45
【问题描述】:

我在我的应用程序中使用 prism/mvvm/mef,并且加载所有标有 ViewExport(Region) 的视图效果很好(我使用的是 StockTraderRI AutoPopulateExportedViewsBehaviour)。

现在我想使用这个运行时查找功能来初始化其他一些后台类。

假设我有一个接口

public interface ITable
{
}

我得到了很多从这个接口派生的类。

有没有办法以某种方式标记这些派生类并让 MEF 在运行时创建它们并将它们添加到某种列表或容器中?

我希望进入一个没有显示的区域?我将如何在 MEF 中实现这一点?

【问题讨论】:

    标签: dependency-injection prism mef


    【解决方案1】:

    当然有! 使用 Export 属性标记继承您的接口的类,并在另一个类中为您自己创建一个属性,例如具有属性 [ImportMany] 的通用类型 ObservableCollection。应该可以解决问题。

    【讨论】:

    • 仅此而已?但是 MEF 怎么知道哪些东西属于哪个集合呢?按泛型类型?
    • 是的,实际上您的不同类将用 [Export(typeof(ITable))] 装饰,MEF 将寻找任何继承或对应于泛型类型的类以满足您的集合、创建实例和将它们添加到集合中。
    【解决方案2】:

    如果您使用 MEF 而不是 Unity,您还可以在引导程序中使用 Container 调用:

    var tables = Container.GetExportedValues<ITable>();
    

    Container 是您的 MEFBootstrapper 的公共属性。

    【讨论】:

    • 它是替代的依赖注入容器。不过,MEF 是我的首选。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-25
    • 1970-01-01
    • 2022-08-19
    • 2011-06-21
    • 2017-03-24
    相关资源
    最近更新 更多