/// <summary> /// Creates middleware object from descriptor /// </summary> private async Task <IMiddleware> CreateInstance(MiddlewareDescriptor descriptor) { if (descriptor.Instance != null) { return(descriptor.Instance); } if (descriptor.ConstructorParameters.Length == 0) { return((IMiddleware)Activator.CreateInstance(descriptor.MiddlewareType)); } object[] parameters = new object[descriptor.ConstructorParameters.Length]; for (int i = 0; i < descriptor.ConstructorParameters.Length; i++) { Type type = descriptor.ConstructorParameters[i]; if (typeof(IContainerScope).IsAssignableFrom(type)) { parameters[i] = _scope; } else { object o = await _mvc.Services.Get(type, _scope); parameters[i] = o; } } return((IMiddleware)Activator.CreateInstance(descriptor.MiddlewareType, parameters)); }
/// <summary> /// Uses singleton middleware objects. /// Same object is used for all requests /// </summary> public void UseMiddleware(IMiddleware middleware) { MiddlewareDescriptor desc = new MiddlewareDescriptor { Instance = middleware, MiddlewareType = middleware.GetType(), ConstructorParameters = null }; Descriptors.Add(desc); }
/// <summary> /// Uses middleware, creates new instance for per request. /// </summary> public void UseMiddleware <TMiddleware>() where TMiddleware : IMiddleware { ConstructorInfo ctor = typeof(TMiddleware).GetConstructors().FirstOrDefault(); if (ctor == null) { throw new ArgumentException(typeof(TMiddleware) + " has no acceptable constructor"); } MiddlewareDescriptor desc = new MiddlewareDescriptor { Instance = null, MiddlewareType = typeof(TMiddleware), ConstructorParameters = ctor.GetParameters().Select(x => x.ParameterType).ToArray() }; Descriptors.Add(desc); }