1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- using System;
- using System.Collections.Generic;
- using System.Reflection;
- namespace Wayne.Lib
- {
- public static class ServiceActivator
- {
- public static T Create<T>(IServiceLocator serviceLocator, params object[] additionalParameter) where T : class
- {
- return (T)CreateInstance(string.Empty,typeof(T), serviceLocator, additionalParameter);
- }
- public static T Create<T>(string serviceId, IServiceLocator serviceLocator, params object[] additionalParameter) where T : class
- {
- return (T)CreateInstance(serviceId, typeof(T), serviceLocator, additionalParameter);
- }
-
- private static object CreateInstance(string servicId,Type typeToInstantiate, IServiceLocator serviceLocator, params object[] additionalParameter)
- {
- object result = TryCreate(typeToInstantiate, serviceLocator, servicId, additionalParameter);
- if (result == null)
- throw new ServiceContainerException(typeToInstantiate, "Could not create object");
- return result;
- }
-
- private static object TryCreate(Type typeToCreate, IServiceLocator serviceLocator, string serviceId, params object[] additionalObjects)
- {
- var constructors = typeToCreate.GetConstructors();
- Array.Reverse(constructors);
- var parameters = new List<object>();
- ConstructorInfo foundConstructor = null;
- foreach (ConstructorInfo constructor in constructors)
- {
- var parameterInfos = constructor.GetParameters();
- parameters.Clear();
- foreach (var parameterInfo in parameterInfos)
- {
- //Check for additionalObjectMatch first!
- int firstMatchingParameterObjectIndex = -1;
- for (int index = 0; index < additionalObjects.Length; index++)
- {
- object additionalObject = additionalObjects[index];
- if (parameterInfo.ParameterType.IsAssignableFrom(additionalObject.GetType()))
- {
- firstMatchingParameterObjectIndex = index;
- break;
- }
- }
- if (firstMatchingParameterObjectIndex >= 0)
- {
- parameters.Add(additionalObjects[firstMatchingParameterObjectIndex]);
- }
- else
- {
- var dependency = serviceLocator.TryGetService(parameterInfo.ParameterType, serviceId);
- if (dependency != null)
- {
- parameters.Add(dependency);
- }
- }
- }
- if (parameters.Count == parameterInfos.Length)
- {
- foundConstructor = constructor;
- break;
- }
- }
- if (foundConstructor != null)
- {
- var stateObject = foundConstructor.Invoke(parameters.ToArray());
- return stateObject;
- }
- return null;
- }
- }
- }
|