使用 MEF 满足现有对象的导入

本文关键字:对象 导入 MEF 满足 使用 | 更新日期: 2023-09-27 17:48:54

给定一个具有 [导入] 标签的任意已经存在的对象,为了让 MEF 填写导入,我必须做什么手鼓舞?

许多博客文档似乎是针对 MEF 的预览版本构建的,并且不再起作用 - 我使用的是作为 .NET 4.0(或者 MEF 2.0 预览版 3)一部分的已发布文档。

AggregateCatalog _catalog;
CompositionContainer _container;
public void Composify(object existingObjectWithImportTags)
{
    lock(_container) {
        var batch = new CompositionBatch();
        // What do I do now?!?!
    }
}

使用 MEF 满足现有对象的导入

MEF 从目录中注册的已注册程序集(包括当前程序集)中的导出类型解析导入(通过属性或构造函数注入)及其自己的依赖项。

如果要直接创建对象(使用 new 关键字),或者在创建时导出尚未准备就绪,则可以使用容器来满足对象的导入,方法是:

_container.SatisfyImportsOnce(yourObject);

我整理了一个小场景来做这件事。 代码如下:

public class Demo
{
    private readonly CompositionContainer _container;
    [Import]
    public IInterface Dependency { get; set; }
    public Demo(CompositionContainer container)
    {
        _container = container;
    }
    public void Test()
    {
        //no exported value, so the next line would cause an excaption
        //var value=_container.GetExportedValue<IInterface>();
        var myClass = new MyClass(_container);
        //exporting the needed dependency
        myClass.Export();
        _container.SatisfyImportsOnce(this);
        //now you can retrieve the type safely since it's been "exported"
        var newValue = _container.GetExportedValue<IInterface>();
    }
}
public interface IInterface
{
    string Name { get; set; }
}
[Export(typeof(IInterface))]
public class MyClass:IInterface
{
    private readonly CompositionContainer _container;
    public MyClass()
    {
    }
    public MyClass(CompositionContainer container)
    {
        _container = container;
    }
    #region Implementation of IInterface
    public string Name { get; set; }
    public void Export()
    {
        _container.ComposeExportedValue<IInterface>(new MyClass());
    }
    #endregion
}

现在,只需使用new Tests(new CompositionContainer()).Test();即可开始演示。

希望这对:)有所帮助

_container.ComposeParts(existingObjectWithImportTags);

ComposeParts 是您正在寻找的扩展方法。

它只是创建一个 CompositionBatch 并调用 AddPart(AttributedModelServices.CreatePart(attributedObject)),然后调用 _container。撰写(批处理)。