如何解决MEF Container.Dispose是否处置添加的目录?
| 这类似于我的代码的外观var catalog = new AssemblyCatalog(typeof(Program).Assembly);
_container = new CompositionContainer(catalog);
代码分析显示警告CA2000:在对它的所有引用超出范围之前,请调用在目录上处理。
因此,我不确定是否需要取消警告或将_catalog转换为字段+处置它。
MEF文档似乎并未提及这一点。
解决方法
根据MEF Preview 9源代码(可能与.NET 4中提供的代码非常匹配),
CompositionContainer
将目录包装为CatalogExportProvider
。此导出提供程序存储在字段中,并与容器一起放置。但是,ѭ3将不会依次处理包装好的ѭ4。
因此,答案是否定的:“ѭ1”不会丢弃目录。
您可以通过运行以下代码来验证这一点,该代码不会在控制台上打印任何内容:
class MyCatalog : ComposablePartCatalog
{
protected override void Dispose(bool disposing)
{
Console.WriteLine(\"Disposed!\");
base.Dispose();
}
public override IQueryable<ComposablePartDefinition> Parts
{
get { throw new NotImplementedException(); }
}
}
class Program
{
static void Main(string[] args)
{
var container = new CompositionContainer(new MyCatalog());
container.Dispose();
Console.ReadKey();
}
}
,Wim已经发现,CompsitionContainer和CatalogExportProvider都不会在目录上调用dispose。他们都没有创建目录,因此他们都不拥有它,因此不会在其上调用Dispose。构造目录的人应该是配置它的人。
在很多情况下,有些人希望与多个容器共享一个目录实例,这就是为什么该容器不拥有该catlaog的所有权,因此不处置它的原因。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。