Getting shared instances

May 5, 2009 at 4:41 AM

I am attempting to use the shared part creation policy for a MEF export. It does not, however, seem to work the way I was thinking. I do the composition twice in my application and each time get a fresh copy of the object. I've proved this by adding an instance counter to the object instanciation

    static int instCount = 0;

   
public FakeAutocompleteRepository()
   
{
        instCount
++;
       
...
   
}

and running it all in debug. Indeed the second time I do a composition I get a new copy of the FakeAutocompleteRepository with instCount = 2. The export section contains

[PartCreationPolicy(CreationPolicy.Shared)]
[Export(typeof(IAutocompleteRepository))]
[ExportMetadata("IsTesting", "True")]
class FakeAutocompleteRepository : IAutocompleteRepository
{ ... }

Is there some trick to getting the same instance for subsiquent requests? In case it is something I'm doing during the composition this is how I'm doing that

var catalog = new AggregateCatalog();
                catalog
.Catalogs.Add(new AssemblyCatalog(System.Reflection.Assembly.GetExecutingAssembly()));
                catalog
.Catalogs.Add(new DirectoryCatalog("."));
               
var container = new CompositionContainer(catalog);
               
var batch = new CompositionBatch();
                batch
.AddPart(this);
                container
.Compose(batch);


               
if (null != ConfigurationSettings.AppSettings["IsTesting"] && bool.Parse(ConfigurationSettings.AppSettings["IsTesting"]))
                    repository
= container.GetExports<IAutocompleteRepository>().Where(expDef => expDef.Metadata.Keys.Contains("IsTesting")).Single().GetExportedObject();

Basically I'm trying to force a specific composition during testing. If you have a better idea for unit testing these compositions then I'm all ears.

May 5, 2009 at 10:59 PM
I actually cross posted this to stackoverflow as well (http://stackoverflow.com/questions/823204/mef-creation-policy/823492#823492) and got an answer there.  I am using multiple containers so I get an instance for each.  I was wondering if there is so way to get the active containers or if it should be handled by something I write (singleton perhaps).  
May 5, 2009 at 11:01 PM
Edited May 5, 2009 at 11:01 PM

--oops, double post--

I actually cross posted this to stackoverflow and got an answer there (http://stackoverflow.com/questions/823204/mef-creation-policy/823492#823492).  It seems I need to have just one container.  Is there an approved of way to do this or should I handle it myself through singleton or something similar?