c# - Simple Injector plugins -


i building system in .net 4.5 have different implementations (i.e. implemented on premise @ different customers). each customer have own infrastructure , database structure, hence building system heavily relying on onion architecture, in relying on interfaces , di. in way, can use customer specific "repository" , "service" implementations.

my aim to, without recompiling, able install system on customers server (the system entry point windows service containing business logic periodically fired, , hosting wcf services). work, have in mind sort of "dependencies" or "plugins" folder subfolder of folder containing windows service executable, contain customer specific dll has concrete classes implementing necessary interfaces on application relies.

i'm trying achieve simple injector. have had @ simpleinjector.packaging assembly, , @ paragraph "registering plugins dynamically" here, i'm still kind of stuck , don't know start, should define in assembly.

i'm in need of concrete sample on how achieve this.

is simpleinjector packaging assembly used purpose, or seeing wrong ? if so, how ?

anybody please enlighten me.

thanks

ps: 100% clear: interfaces , concrete implementations separated different assemblies. question how wire things dynamically using simple injector.

the beauty of doing in combination ioc container such simple injector is easy add common logic of plug-ins. wrote bulk image converter utility allowed plugging in new image converters.

this interface

public interface iimageconverter : idisposable {     string name { get; }     string defaultsourcefileextension { get; }     string defaulttargetfileextension { get; }     string[] sourcefileextensions { get; }     string[] targetfileextensions { get; }     void convert(imagedetail image); } 

registration done (note error checking plug-in dependencies not .net assemblies)

private void registerimageconverters(container container) {     var pluginassemblies = this.loadassemblies(this.settings.plugindirectory);      var plugintypes =         dll in pluginassemblies         type in dll.getexportedtypes()         typeof(iimageconverter).isassignablefrom(type)         !type.isabstract         !type.isgenerictypedefinition         select type;      container.registerall<iimageconverter>(plugintypes); }  private ienumerable<assembly> loadassemblies(string folder) {     ienumerable<string> dlls =         file in new directoryinfo(folder).getfiles()         file.extension == ".dll"         select file.fullname;      ilist<assembly> assemblies = new list<assembly>();      foreach (string dll in dlls) {         try {             assemblies.add(assembly.loadfile(dll));         }         catch { }     }      return assemblies; } 

common logic required plug-in operations handled decorators

container.registerdecorator(     typeof(iimageconverter),      typeof(imageconverterchecksumdecorator)); container.registerdecorator(     typeof(iimageconverter),      typeof(imageconverterdeleteandrecycledecorator)); container.registerdecorator(     typeof(iimageconverter),      typeof(imageconverterupdatedatabasedecorator)); container.registerdecorator(     typeof(iimageconverter),      typeof(imageconverterloggingdecorator)); 

this final class more specific have added example of how can find required plug-in without taking direct dependency on container

public sealed class pluginmanager : ipluginmanager {     private readonly ienumerable<iimageconverter> converters;      public pluginmanager(ienumerable<iimageconverter> converters) {         this.converters = converters;     }      public ilist<iimageconverter> list() {         return this.converters.tolist();     }      public ilist<iimageconverter> findbysource(string extension) {         ienumerable<iimageconverter> converters = this.converters             .where(x =>                 x.sourcefileextensions.contains(extension));          return converters.tolist();     }      public ilist<iimageconverter> findbytarget(string extension) {         ienumerable<iimageconverter> converters = this.converters             .where(x =>                 x.targetfileextensions.contains(extension));          return converters.tolist();     }      public ilist<iimageconverter> find(         string sourcefileextension,          string targetfileextension)     {         ienumerable<iimageconverter> converter = this.converters             .where(x =>                 x.sourcefileextensions.contains(sourcefileextension) &&                 x.targetfileextensions.contains(targetfileextension));          return converter.tolist();     }      public iimageconverter find(string name) {         ienumerable<iimageconverter> converter = this.converters             .where(x => x.name == name);          return converter.singleordefault();     } } 

you register ipluginmanager in container , simple injector rest:

container.register<ipluginmanager, pluginmanager>(); 

i hope helps.


Comments

Popular posts from this blog

android - Get AccessToken using signpost OAuth without opening a browser (Two legged Oauth) -

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: mockito -

google shop client API returns 400 bad request error while adding an item -