/// <summary> /// Specifies a multi-use implementing object for a given contract type. /// </summary> public Needs Add(Type contractType, object impl) { if (!contractType.IsInstanceOfType(impl)) { throw new InvalidImplementationException(contractType, impl.GetType()); } resolvers[contractType] = new MultiUseResolver(impl); return(this); }
// Create and store Resolver. Resolver returns same instance for each call if // implType is multi-use, returns new instance on each call if single-use. private object Persist(Type contractType, Type implType) { if (IsSingleUse(implType)) { var resolver = new SingleUseResolver(this, contractType, implType); resolvers[contractType] = resolver; return(resolver.Resolve()); } var impl = New(contractType, implType); resolvers[contractType] = new MultiUseResolver(impl); return(impl); }
/// <summary> /// Decorates specified contract type with decorator function. /// </summary> public Needs Decorate(Type contractType, Func <object, object> decorate) { if (resolvers.TryGetValue(contractType, out var resolver)) { if (resolver is MultiUseResolver) { resolvers[contractType] = new MultiUseResolver(decorate(resolver.Resolve())); } else { resolvers[contractType] = new SingleUseDecoratorResolver(resolver, decorate); } } else { var inner = GetMaybe(contractType).OrElseThrow(new ImplementationUnresolvedException(contractType)); var outer = decorate(inner); CheckReliablitiy(contractType, outer.GetType(), inner.GetType()); resolvers[contractType] = new MultiUseResolver(outer); } return(this); }