c# - Disposing of parts when removing from container -


i use compositionbatch add composable part container , remove later recomposition. works well, composition , recomposition. problem underlying object doesn't disposed. code looks this:

[partcreationpolicy(creationpolicy.nonshared)] [export] public class nonshared : idisposable {     public nonshared()     {         console.writeline("constructor of nonshared");     }      public void dispose()     {         console.writeline("disposing nonshared");     } }  class program : ipartimportssatisfiednotification {     [import(allowdefault=true, allowrecomposition=true)]     private nonshared _nonshared;      public void onimportssatisfied()     {         console.writeline("program.onimportssatisfied()");     }      static void main()     {         new program().run();     }      private void run()     {         var partdefinition = attributedmodelservices.createpartdefinition(typeof(nonshared), null);         var exportingpart = partdefinition.createpart();          var addingbatch = new compositionbatch();         addingbatch.addpart(this);         addingbatch.addpart(exportingpart);          var container = new compositioncontainer();         container.compose(addingbatch);          // something.          var removingbatch = new compositionbatch();         removingbatch.removepart(exportingpart);          container.compose(removingbatch);     } } 

i nonshared.dispose() called, isn't. parts lifetime @ addpart/removepart describes, non-shared parts should disposed in situation. there mistakes in code ?

as far know parts added using compositionbatch handled composablepartexportprovider (this implementation detail) not dispose them. catalogpartexportprovider disposes exported parts , use provider need let mef create parts.

for more information on this, can read first answer weshaggard in what releaseexport do?.

if work on .net 4.5 use conventions model introduced mef2. otherwise can use typecatalogs combined aggregatecatalog add types container, compositioncontainer.releaseexport release (and dispose if supported) non-shared parts @ , aggregatecatalog.catalogs. remove remove types container.

here's sample using typecatalog:

class program : ipartimportssatisfiednotification {     [import(allowdefault=true, allowrecomposition=true)]     private lazy<nonshared>_nonshared; //lazy<t> needed releaseexport work.      public void onimportssatisfied()     {         console.writeline("program.onimportssatisfied()");     }      static void main()     {         new program().run();     }      private void run()     {         var aggregatecatalog = new aggregatecatalog();         using (var container = new compositioncontainer(aggregatecatalog ))         {             container.composeparts(this);             //check if field injected. shouldn't since              //nonshared type not known container yet..             console.writeline("nonshared field {0}", this._nonshared != null ? "exists" : "does not exist");             //add nonshared type type catalog.             var typecatalog = new typecatalog(typeof(nonshared));             //add typecatalog aggregatecatalog.             aggregatecatalog.catalogs.add(typecatalog);             //check if field injected. time should be.             console.writeline("nonshared field {0}", this._nonshared != null ? "exists" : "does not exist");              if(this._nonshared != null)             {                 //access lazy object gets value.                 this._nonshared.value.tostring();                 //release part. dispose method should called.                 container.releaseexport<nonshared>(this._nonshared);             }         }     } } 

you can test removal of whole type catalog with:

aggregatecatalog.catalogs.remove(typecatalog); 

Comments

Popular posts from this blog

c# - Send Image in Json : 400 Bad request -

jquery - Fancybox - apply a function to several elements -

An easy way to program an Android keyboard layout app -