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 ExportFactory类:https://msdn.microsoft.com/en-us/library/ff382807 (v = vs.110) . aspx
这是autofacc的Owned<>和Func<>想法的混合。注意那个出口工厂。CreateExport返回可丢弃的ExportLifetimeContext。处理导出生命周期上下文也将处理被注入的部分及其所有依赖项。ExportFactory的行为根据所有者部分的实例化模式略有不同。如果所有者类是单例的,ExportFactory将总是创建新的实例(行为类似于Func
下面是使用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
{ }