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

时间:2015-10-19 17:52:51

标签: c# generics delegates mef constructor-injection

底部的代码来自正在运行的 WPF示例应用程序,该应用程序使用 Autofac 进行依赖项注入。 我想转换为最新版本的 MEF 。我还安装了NuGet包CommonServiceLocator(V。1.3)和Prism.Core,Prism.Mef和Prism.Wpf(全部6.1)。 当我做的时候

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

我从&#34; Func ...&#34;得到一个ActivationException。 FriendDataProvider的构造函数中的声明。 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
{ }

1 个答案:

答案 0 :(得分:1)

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

它是Owned&lt;&gt;的混合物。和Func&lt;&gt;来自AutoFac的想法。请注意,ExportFactory.CreateExport返回的是Disposable的ExportLifetimeContext。处置导出生命周期上下文还将处理注入的部分及其所有依赖项。 ExportFactory行为略有不同,具体取决于所有者部分的Instancing模式。如果所有者类是单例,则ExportFactory将始终创建新实例(在Autofac中的行为类似于Func&lt; Owned&lt; T&gt;&gt;),但如果将其与CompositionScopes结合使用,您将获得类似于Func&lt;的行为。 T&GT;在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
{ }
相关问题