private object GetTypeWithCtorParams(IBaseTypeAction container, TypeContextFactory factory) { object concreteResult = null; IList <object> args = new List <object>(); if (container.Ctor != null) { var foundCtor = container.TypeToCreate.GetConstructor(container.Ctor); CreateCtorParams(factory, foundCtor.GetParameters(), args); concreteResult = foundCtor.Invoke(args.ToArray()); } else { var ctors = container.TypeToCreate.GetConstructors().Where(x => x.GetParameters().Any()); if (ctors.Any()) { var ctorParams = ctors.First().GetParameters(); CreateCtorParams(factory, ctorParams, args); concreteResult = container.TypeToCreate.GetConstructor(args.Select(x => x.GetType()).ToArray()).Invoke(args.ToArray()); } } return(concreteResult); }
private object GetInstanceType(TypeContextFactory factory, IBaseTypeAction typeAction) { if (typeAction.Instance != null) { return(typeAction.Instance); } var concreteResult = GetTypeWithCtorParams(typeAction, factory) ?? Activator.CreateInstance(typeAction.TypeToCreate); return(concreteResult); }
public override object Instance(TypeContextFactory factory, IBaseTypeAction typeAction) { if (_instance != null) { return(_instance); } lock (_lock) { _instance = base.Instance(factory, typeAction); } return(_instance); }
public override object Instance(TypeContextFactory factory, IBaseTypeAction typeAction) { if (_data != null) { return(_data.Value); } lock (_locked) { _data = new ThreadLocal <object>(() => base.Instance(factory, typeAction)); } return(_data.Value); }
private static void CreateCtorParams(TypeContextFactory factory, IEnumerable <ParameterInfo> parameterInfo, IList <object> args) { foreach (var param in parameterInfo) { var foundType = factory.FindTypeFromParameter(param.ParameterType); if (foundType != null) { var instanceToAdd = factory.GetInstance(foundType.RegisteredTypeAction.InterfaceType); args.Add(instanceToAdd); } } }
public virtual object Instance(TypeContextFactory factory, IBaseTypeAction typeAction) { var concreteResult = GetInstanceType(factory, typeAction); if (typeAction.GetType().GetInterfaces().Any(x => x.IsGenericType && x.GetGenericTypeDefinition() == typeof(ITypeAction <,>))) { dynamic typeContainer = typeAction; if (typeContainer.AfterCreationDoThis != null) { concreteResult = typeContainer.AfterCreationDoThis((dynamic)concreteResult); } } return(concreteResult); }