.NET 4.0 Provides an easy way for runtime or aftermarket plugins and components, its called Composition.
Before composition we had to load each assembly, check its types and create new instances, I've provided a demo in class PreCompositionInfrastructure.
Composition provides that infrastructure and more, it allows you to specify if you want only one object or multiple, you can specify imports by attribute or by method, specify exports by type or contract, lazy initialization of imports by type or contact.
You just need to add a reference to System.ComponentModel.Composition, create a catalog with directory or assembly and when one is not enough, you can aggregate catalogs.
Then you can either get specific plugins with GetExportedValue or GetExportedValues, or you can let composition do it automatically with ComposeParts, but you'll have to use property attributes to specify which properties will be populated with which plugins and if its many or just one.
On the plugin side, you need to add a reference to System.ComponentModel.Composition and specify which class is an Export of which interface/contract, of curse you have to have access to the same interface from both the imports and the exports, so I recommend using another class library for that interface(s).
And we have to have some benchmarks, but its not really an issue since most applications load plugins at startup and never touch it again and its a lot better having an easy to program infrastructure rather than a quick one if its not affecting the overall performance of the application.
For 1000 iterations:
PluginInfrastructre - 1846ms
PluginInfrastructureImports - 1951ms
(More or less the same time, deviation because of unrelated changes)
PreCompositionInfrastructure - 294ms
Before composition we had to load each assembly, check its types and create new instances, I've provided a demo in class PreCompositionInfrastructure.
Composition provides that infrastructure and more, it allows you to specify if you want only one object or multiple, you can specify imports by attribute or by method, specify exports by type or contract, lazy initialization of imports by type or contact.
You just need to add a reference to System.ComponentModel.Composition, create a catalog with directory or assembly and when one is not enough, you can aggregate catalogs.
Then you can either get specific plugins with GetExportedValue or GetExportedValues, or you can let composition do it automatically with ComposeParts, but you'll have to use property attributes to specify which properties will be populated with which plugins and if its many or just one.
On the plugin side, you need to add a reference to System.ComponentModel.Composition and specify which class is an Export of which interface/contract, of curse you have to have access to the same interface from both the imports and the exports, so I recommend using another class library for that interface(s).
And we have to have some benchmarks, but its not really an issue since most applications load plugins at startup and never touch it again and its a lot better having an easy to program infrastructure rather than a quick one if its not affecting the overall performance of the application.
For 1000 iterations:
PluginInfrastructre - 1846ms
PluginInfrastructureImports - 1951ms
(More or less the same time, deviation because of unrelated changes)
PreCompositionInfrastructure - 294ms
0 comments:
Post a Comment