如何在 MEF 2 中导出工厂和/或其方法
本文关键字:工厂 方法 MEF | 更新日期: 2023-09-27 18:36:41
我正在研究MEF 2(Microsoft.Composition),并希望将其与我现有的代码库集成。
我当前的代码库有一个带有简单签名的IFactory
接口:
public interface IFactory<T>
{
T Create();
}
我想注册我的工厂,这样如果我对工厂进行出口,它就被注册为工厂T
产出的Func<T>
。 所以像这样:
[Export]
public class Factory : IFactory<Class>
{
public Class Create() => new Class();
}
将使用以下代码返回一个新的Class
实例和对 Create
方法的引用(作为Func<Class>
委托):
using ( var container = new ContainerConfiguration()
// ... magic missing here.
.CreateContainer() )
{
var instance = container.GetExport<Class>(); // instance is created from the Factory.Create above.
var factory = container.GetExport<Func<Class>>(); // this is a reference to the Factory.Create delegate defined above.
}
我确实看到了这个问题,但它似乎不适用于 MEF 2。 现在各种各样的东西都不一样了,但似乎更轻量级/精简(正如广告所宣传的那样!
是否有可能实现我想用 MEF 2 做的事情?
public Class Create() => new Class();
不是委托。在 C# 6 中,这称为表达式主体成员函数。
以下 2 个语句在 C# 6 中是等效的:
// Expression-bodied member function
public MyClass Create() => new MyClass();
// standard member function
public MyClass Create()
{
return new MyClass();
}
至于解决IFactory<Class>
然后使用工厂,只需根据需要使用要导出和使用的类型装饰您的工厂:
[Export( typeof( IFactory<MyClass> ) )]
public class Factory : IFactory<MyClass>
{
public MyClass Create() => new MyClass();
}
构建容器后,解决方案很简单:
var factory = container.GetExport<IFactory<MyClass>>();
MyClass mc = factory.Create();