MEF可以解析返回接口的Func委托吗?
底部的代码来自正在工作 WPF示例应用程序使用Autofac进行依赖注入。 我想转换为最新版本的MEF。我还安装了NuGet软件包CommonServiceLocator(V. 1.3)和Prism.Core,Prism.Mef和Prism.Wpf(全部6.1)。 当我做MEF可以解析返回接口的Func委托吗?
var provider = ServiceLocator.Current.GetInstance<FriendDataProvider>();
我得到一个ActivationException从FriendDataProvider的构造函数的“FUNC。”声明。 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 ExportFactory类: https://msdn.microsoft.com/en-us/library/ff382807(v=vs.110).aspx
It'a拥有<的混合物>和Func键<>从AutoFac想法。注意ExportFactory.CreateExport返回一次性的ExportLifetimeContext。处置导出生命周期还将处理注入的部分及其所有依赖关系。根据所有者部分的实例化模式,ExportFactory行为稍有不同。如果所有者类是单例,ExportFactory将始终为您创建新实例(行为与Func <在Autofac中拥有< T >>),但如果将它与CompositionScopes结合使用,您将在AutoFac中获得类似于Func < T>的行为。见例如: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
{ }
我可能要深入挖掘生命周期管理,但使用ExportFactory&CreateExport()使代码运行正常为止。非常感谢您的帮助! – ChrisK