c# - MEF:无法导入其他类?

标签 c# wpf null mef

编辑:马特,这确实解决了我的一些(大部分)问题,谢谢。现在唯一挥之不去的问题是如何在 WPF 中执行此操作?我有一个基于 UserControl 的自定义部分,但在 WPF 中没有办法:

[Import]<my:SomeCustomControl>

所以级联在这种情况下不起作用。

/编辑


我在项目中 [导入] 各种 MEF 组件时遇到问题。我是否必须在我使用的每个类中都使用 CompositionContainer?在下面的代码中,Helper.TimesTwo() 方法中抛出了空引用异常,但是当我在 Program 类中调用 logger.Log() 时,一切正常。任何帮助将不胜感激。

(这将编译并作为控制台应用程序运行)。

using System;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            var p = new Program();
            p.Run();
        }

        [Import]
        private ILog logger { get; set; }

        public void Run()
        {
            var catalog = new DirectoryCatalog(".");
            var container = new CompositionContainer(catalog);
            var batch = new CompositionBatch();
            batch.AddPart(this);
            container.Compose(batch);

            logger.Log("hello");
            var h = new Helper();
            logger.Log(h.TimesTwo(15).ToString());
            Console.ReadKey();
        }
    }

    class Helper
    {
        [Import]
        private IDouble doubler { get; set; }

        private Helper()
        {
            // do I have to do all the work with CompositionContainer here again?
        }

        public double TimesTwo(double d)
        {
            return doubler.DoubleIt(d);
        }
    }

    interface ILog
    {
        void Log(string message);
    }

    [Export(typeof(ILog))]
    class MyLog : ILog
    {
        public void Log(string message)
        {
            Console.WriteLine("mylog: " + message);
        }
    }

    interface IDouble
    {
        double DoubleIt(double d);
    }

    [Export(typeof(IDouble))]
    class MyDoubler : IDouble
    {
        public double DoubleIt(double d)
        {
            return d * 2.0;
        }
    }
}

最佳答案

我认为诀窍在于利用 MEF 将级联其导入这一事实。因此,如果您导入 Helper 实例而不是将其声明为局部变量,则 Helper 需要的任何导入都将得到满足。

    [Import]
    public Helper MyHelper { get; set; }

    public void Run()
    {
        var catalog = new DirectoryCatalog(".");
        var container = new CompositionContainer(catalog);
        var batch = new CompositionBatch();
        batch.AddPart(this);
        container.Compose(batch);
        logger.Log("hello");
        logger.Log(MyHelper.TimesTwo(15).ToString());
        Console.ReadKey();
    }

我确信有一种方法可以让它满足局部变量中的任何导入,但我喜欢使用这样的“级联导入”功能。

关于c# - MEF:无法导入其他类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/500023/

相关文章:

wpf - 如何格式化绑定(bind)到 TextBox 的小数而不激怒我的用户?

带有严格空值检查的 TypeScript - 数组访问呢?

c# - 获取在 C# 中创建的进程的 pid

c# - 使用 C# 和 C++/CX 时是否需要固定数据

c# - 如何获取发生异常的线程的名称?

c# - 带有枚举角色参数的自定义 AuthorizeAttributte 在 ajax 调用中获取空值

c# - WPF 绑定(bind)控件在运行时的宽度

WPF 样式触发器

java - 斐波那契数字数组和元素可被 2 整除的数组的另一个副本(欧拉概率 2),交换空元素

返回后Javascript对象为空