2012-02-10 23 views
0

如何确保容器是类的实例还是不是,取决于是否存在链接。 使用MEF容器I,C#MEF容器中的实现或不实现

编辑: enter image description here

换句话说,我需要管理的对象共享类的寿命的能力。例如,我有两个点(对象Obj1,Obj2),它们导入了对共享对象(Obj3)的引用,但是这些类是无共享的,并且不会长期存在,但对象(Obj3) - 它们导入的链接它大而昂贵,它始终保持在记忆中。

也许还有其他的IoC容器,这将提供更多的机会来处理对象的生命周期?

+0

我不明白你的问题。 – Gilles 2012-02-10 19:03:01

+0

我试图解释我的问题。 – Ivan 2012-02-11 05:26:56

+0

你说你有两点,你是指两部分? obj1和2是普通对象还是由MEF创建的? – Gilles 2012-02-11 05:27:47

回答

1

使用共享创建策略创建的部件将由容器保存并共享容器的生命周期。

即使共享零件用于填充已处置对象的导入,该零件仍将与该容器一起存在。

这里是要解决这个问题的办法:

1:

[PartCreationPolicy(CreationPolicy.NonShared)] 

2:用你的出口下列属性附加伤害更改为部分非共享的创建策略可以释放在容器上使用ReleaseExport方法(docdoc)。请注意,这将再次只适用于NonShared部分。

3:为您的共享部分使用子容器(doc)。通过这种方式,您可以处理子容器,然后处理它的共享部分。您可以在使用中使用儿童容器,以确保它在使用后被丢弃。这是我看到摆脱容器中共享部分的唯一方法。

哦,顺便说一句,

可能还有其他的IoC容器,

MEF是不是技术上的IoC容器。它使用IoC的概念,您可以像使用IoC容器一样使用它,但它首先是最重要的扩展框架。

+0

有用的信息,尤其是第三段(这个想法!)。也许还有IoC容器可以让你的工作比MEF更漂亮,至少在声称我的问题上工作? – Ivan 2012-02-11 06:28:41

+0

不幸的是,在MEF中,如果你想保持零件策略NonShared,你将不得不使用一个子容器。 – Gilles 2012-02-13 19:50:45

+0

有其他选择吗?工作更方便吗? – Ivan 2012-02-16 13:26:05