MEF可以解析返回接口的函数委托吗?

本文关键字:函数 可以解 返回 接口 MEF | 更新日期: 2023-09-27 18:18:34

底部的代码来自一个工作的 WPF示例应用程序,它使用Autofac进行依赖注入。我想转换为最新版本的MEF。我也有NuGet包CommonServiceLocator (V. 1.3)和Prism。核心,棱镜。Mef和Prism。安装了Wpf(全部为6.1)。当我做

var provider = ServiceLocator.Current.GetInstance<FriendDataProvider>();

我从FriendDataProvider的构造函数中的"Func…"声明中获得一个ActivationException。MEF能做到这一点吗?如果是,需要哪些属性声明?

[Export]
public class FriendDataProvider
{
    private readonly Func<IDataService> _dataServiceCreator;
    [ImportingConstructor]
    public FriendDataProvider(Func<IDataService> dataServiceCreator) // <= DI ERROR
    {
        _dataServiceCreator = dataServiceCreator;
    }
    public void DoSomething()
    {
        using (var service = _dataServiceCreator()) // Factory
        {            }
    }
}
[Export(typeof(IDataService))]
public class DataService : IDataService
{
    public ClassA GetSomething()
    {
        return new ClassA();
    }
    public void Dispose()
    {        }
}

public interface IDataService : IDisposable
{
    ClassA GetSomething();
}
public class ClassA
{ }

MEF可以解析返回接口的函数委托吗?

很可能你正在寻找MEF ExportFactory类:https://msdn.microsoft.com/en-us/library/ff382807 (v = vs.110) . aspx

这是autofacc的Owned<>和Func<>想法的混合。注意那个出口工厂。CreateExport返回可丢弃的ExportLifetimeContext。处理导出生命周期上下文也将处理被注入的部分及其所有依赖项。ExportFactory的行为根据所有者部分的实例化模式略有不同。如果所有者类是单例的,ExportFactory将总是创建新的实例(行为类似于Func>在autofacc中),但是如果你将它与compostionscopes结合使用,你会得到类似于Func在AutoFac。示例:http://blogs.microsoft.co.il/bnaya/2013/01/16/mef-20-mini-series-part-6-composition-scoping-and-lifetime-management/

下面是使用ExportFactories重写的示例:

   [Export]
public class FriendDataProvider
{
    private readonly ExportFactory<IDataService> _dataServiceCreator;
    [ImportingConstructor]
    public FriendDataProvider(ExportFactory<IDataService> dataServiceCreator) // <= DI ERROR
    {
        _dataServiceCreator = dataServiceCreator;
    }
    public void DoSomething()
    {
        using (var service = _dataServiceCreator.CreateExport()) // Factory
        {
        }
    }
}
[Export(typeof(IDataService))]
public class DataService : IDataService
{
    public ClassA GetSomething()
    {
        return new ClassA();
    }
    public void Dispose()
    { }
}

public interface IDataService : IDisposable
{
    ClassA GetSomething();
}
public class ClassA
{ }