コード例 #1
0
        /// <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);
        }
コード例 #2
0
        // 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);
        }
コード例 #3
0
        /// <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);
        }