Doubt about CreationPolicy.NonShared

Mar 13, 2012 at 4:11 PM

Hello,

When I create a class like this

[Export, PartCreationPolicy(CreationPolicy.NonShared)]
public class Foo
{
}

and I instantiate it using

[Import]
Foo f;

// or

/*CompositionContainer*/ container.GetExportedValue<Foo>();

Does the container store a reference of the created instance?

Mar 13, 2012 at 5:20 PM

Hi,

If Foo implements IDisposable, or has recomposable imports, then yes - the container will track a reference to the instance.

When creating many instances of a non-shared part, it is advisable to employ either nested containers or ExportFactory<T> (with or without CompositionScopeDefinition) to ensure that the instances can be released when appropriate.

Hope this helps,
Nick

Mar 13, 2012 at 9:32 PM

Hi Nick,

Thank you for your quick response.

I'm creating a desktop application so I can't use ExportFactory<T>. But now I've another doubt if the container isn't tracking the references of non-shared parts how I can released them using a nested container?

Mar 13, 2012 at 9:43 PM

You're welcome. When you get exports from a nested container, the lifetime of any tracked parts will be bound to the nested container. Disposing (or GC'ing) the nested container then releases the tracked parts.

Nick

Mar 13, 2012 at 9:47 PM

I see.

Thank you once again for your help

Exoide

Mar 14, 2012 at 10:51 AM

Hi,

You can look at MEF2 bits which does have ExportFactory<T> on the desktop side.

 

Ido