예제 #1
0
 public IObjectAssemblySpecification Register(string name, Type tType, Type tImpl)
 {
     if (tType.ContainsGenericParameters)
     {
         return(RegisterOpenType(name, tType, tImpl));
     }
     else
     {
         return(Register(name, tType, CreateInstanceDelegateFactory.Create(tImpl)));
     }
 }
        private object HandleUnResolved(Exception knfe, string name, Type type)
        {
            if (type.IsGenericType)
            {
                object result = ResolveUsingOpenType(knfe, name, type);
                if (result != null)
                {
                    return(result);
                }
            }

            if (type.IsClass)
            {
                try
                {
                    var func = CreateInstanceDelegateFactory.Create(type);
                    Register(name, type, func);

                    return(_typeRegistry.Get(name, type).GetInstance());
                }
                catch
                {
                    throw new KeyNotFoundException(ResolveFailureMessage(type), knfe);
                }
            }

            if (type.IsInterface)
            {
                var regs = _typeRegistry.GetDerived(name, type);
                var reg  = regs.FirstOrDefault();
                if (reg != null)
                {
                    object instance = reg.GetInstance();
                    Register(name, type, (c) => c.Resolve(name, instance.GetType()));
                    return(instance);
                }
                else
                {
                    throw new KeyNotFoundException(ResolveFailureMessage(type), knfe);
                }
            }
            throw new KeyNotFoundException(ResolveFailureMessage(type), knfe);
        }