我有没有办法
限制我允许的特定导入
新实例化的扩展
决心?
将扩展代码加载到单独的容器中,并确保受限制的部分在该容器中不可用。让我们将情况简化为这些类来构造一个示例:
[Export]
public class MyExtension
{
[Import]
public PublicService Service { get; set; }
}
[Export]
public class PublicService
{
}
[Export]
public class InternalService
{
}
[Export]
public class Program
{
[Import]
public MyExtension Extension { get; set; }
[Import]
public PublicService Service1 { get; set; }
[Import]
public InternalService Service2 { get; set; }
}
目标是允许
MyExtension
进口
PublicService
但是
不
InternalService
. 内部代码类似
Program
应该可以导入任何内容。你可以这样做到:
var publicCatalog = new TypeCatalog(typeof(PublicService), typeof(MyExtension));
var publicContainer = new CompositionContainer(publicCatalog);
var internalCatalog = new TypeCatalog(typeof(Program), typeof(InternalService));
var internalContainer =
new CompositionContainer(internalCatalog, publicContainer);
var program = internalContainer.GetExport<Program>();
此代码不会引发组合异常。如果现在更改导入
我的扩展
去禁地
内部服务
,您将得到所需的构图异常。
这种设置的一个副作用是
公共服务
也不能导入任何私有服务,就像
我的扩展
. 这是有道理的,否则什么都不会停止
公共服务
通过属性公开私有服务。
我已经用过
TypeCatalog
例如,但是在实践中,您可能应该使用
FilteredCatalog sample
.
此特定应用程序具有
重复的扩展对象
实例化。我可以导入多个
控制器和机器的类型,
在不同的
项目的组合。我不能
找一个好办法来对付我,
所以我在做我自己的类型发现
实例化。有什么好办法
在MEF或其他DI中执行此操作
框架?
你可能只是在追求
PartCreationPolicy
属性,该属性控制每个导入的部件是共享(如中所示,每个容器只创建一次)还是实例化多次。您还可以指定
RequiredCreationPolicy
导入属性中的参数。
如果这不能解决你的问题,看看
PartCreator sample
在mef源代码中(尽管注意它可能很快将被重命名为exportfactory,但它已经在mef的silverlight版本中)。