c# - Register default Castle Windsor components while allowing custom components -
i trying implement convention based registration castle windsor, cannot figure out how deal swapping out default implementations of services.
in framework, might have interface service , default implementation:
public interface ilogger { void info(string message); } public class logger : ilogger { public void info(string message) { console.writeline(message); } }
in typical use case, want castle windsor register logger ilogger service.
however, there use cases client code might provide alternate implementation of ilogger:
public class customlogger : ilogger { public void info(string message) { console.writeline("[log]: {0}", message); } }
in use case, want castle windsor register customlogger ilogger service instead of logger.
so far, i've tried tiered approach attempt register default interfaces, followed non-default interfaces:
using (var container = new windsorcontainer()) { container.register( classes.fromassemblyindirectory(new assemblyfilter(plugindirectorypath)) .where(type => true) .withservice.defaultinterfaces(), classes.fromassemblyindirectory(new assemblyfilter(plugindirectorypath)) .where(type => true) .withservice.allinterfaces()); var logger = container.resolve<ilogger>(); logger.info("hello, world!"); }
however, doesn't seem work both logger , customlogger registered ilogger, still logger when resolve ilogger. tips how this?
also, cannot register each component , service individually composition root own executable separate client code, has limited knowledge of services available without doing assembly scanning.
first registered wins, so... register non-default implementations first , register default implementations fill gaps.
Comments
Post a Comment