public DecoratedInstance <TTarget> With <TDecorator>() { ContextEnrichmentHandler <TTarget> decorator = (ctx, t) => { var pluginType = ctx.BuildStack.Current.RequestedType; ctx.RegisterDefault(pluginType, t); return(ctx.GetInstance <TDecorator>()); }; _instance.EnrichWith(decorator); return(new DecoratedInstance <TTarget>(_instance, decorator)); }
public DecoratedInstance <T> AndThen <TDecorator>() { var previous = _decorator; ContextEnrichmentHandler <T> newDecorator = (ctx, t) => { var pluginType = ctx.BuildStack.Current.RequestedType; var innerInstance = previous(ctx, t); ctx.RegisterDefault(pluginType, innerInstance); return(ctx.GetInstance <TDecorator>()); }; _instance.EnrichWith(newDecorator); _decorator = newDecorator; return(this); }
public DecoratedInstance <TTarget> AndThen <TDecorator>() { //Must be captured as a local variable, otherwise the closure's decorator will //always be the outer-most decorator, causing a Stack Overflow. var previousDecorator = _decorator; ContextEnrichmentHandler <TTarget> newDecorator = (ctx, t) => { var pluginType = ctx.BuildStack.Current.RequestedType; var innerInstance = previousDecorator(ctx, t); ctx.RegisterDefault(pluginType, innerInstance); return(ctx.GetInstance <TDecorator>()); }; _instance.EnrichWith(newDecorator); _decorator = newDecorator; return(this); }
public DecoratorHelper(SmartInstance <TTarget> instance) { _decorateCommand = e => instance.EnrichWith(e); }