【问题标题】:CompositionInitializer missing from MEF 4.5. What can I use instead?MEF 4.5 中缺少 CompositionInitializer。我可以用什么代替?
【发布时间】:2013-01-16 00:11:45
【问题描述】:

我在 .NET 4.5 中找不到 System.ComponentModel.Composition.Initialization.dll(其中包含 CompositionInitializer 类的声明)。此程序集是否已从 .NET 4.5 中的 MEF 中删除? 我现在如何编写标有 [Export] 和 [Import] 属性的应用程序的各个部分?

假设我有这样的看法:

    internal partial class StartWindow : Window
    {
        public StartWindow()
        {
            InitializeComponent();
            DataContext = ViewModel;
        }

        [Import]
        public IStartWindowViewModel ViewModel { get; set; }
    }

和适当的 ViewModel:

    [Export]
    internal class StartWindowViewModel : IStartWindowViewModel
    {
        public IEnumerable<Customer> Customers { get; set; }
    }

我应该在我的 shell(或其他地方)中添加什么来组成这些部分?

【问题讨论】:

    标签: c# .net mvvm dependency-injection mef


    【解决方案1】:

    CompositionInitializer 和类似的类存在于 Silverlight 中,但不是完整的 .NET Framework。 MEF 团队故意决定将他们排除在外,因为他们认为他们不合适。

    逻辑是应该使用构造注入。

    话虽如此,Silverlight 中应用该类的逻辑在 WPF 中的应用完全相同。我有blogged about this in .NET 4,并包含一个适用于整个框架的实现。

    【讨论】:

    • 你能举一个简单的MEF构造函数注入的例子吗?我想在 shell 中使用适当的 ViewModel 组合我的所有视图。
    • @DmitryMartovoi 这很难做到,除非你在代码中构建你的视图。请参阅此处的构造函数部分:mef.codeplex.com/wikipage?title=Declaring%20Imports
    【解决方案2】:

    你失去了初始化组合,f.e.

        _container = new CompositionContainer(catalog);
    
        //Fill the imports of this object
        try
        {
            this._container.ComposeParts(this);
        }
        catch (CompositionException compositionException)
        {
            Console.WriteLine(compositionException.ToString());
        }
    

    msdn

    【讨论】:

    • @DmitryMartovoi,是的,但您可以将它们放在一起
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多