public static IServiceLocator CreateServiceLocator(bool initializeServiceLocator = true)
{
lock (_lockObject)
{
var serviceLocator = CreateServiceLocatorFunc();
if (serviceLocator == null)
{
throw Log.ErrorAndCreateException<Exception>("Failed to create the IServiceLocator instance using the factory method");
}
if (!serviceLocator.IsTypeRegistered<IDependencyResolver>())
{
var dependencyResolver = CreateDependencyResolverFunc(serviceLocator);
if (dependencyResolver == null)
{
throw Log.ErrorAndCreateException<Exception>("Failed to create the IDependencyResolver instance using the factory method");
}
serviceLocator.RegisterInstance(typeof(IDependencyResolver), dependencyResolver);
}
if (!serviceLocator.IsTypeRegistered<ITypeFactory>())
{
var typeFactory = CreateTypeFactoryFunc(serviceLocator);
if (typeFactory == null)
{
throw Log.ErrorAndCreateException<Exception>("Failed to create the ITypeFactory instance using the factory method");
}
serviceLocator.RegisterInstance(typeof(ITypeFactory), typeFactory);
}
if (initializeServiceLocator)
{
if (_serviceLocatorInitializers == null)
{
_serviceLocatorInitializers = new List<Type>(TypeCache.GetTypes(x => !x.IsInterfaceEx() & x.ImplementsInterfaceEx<IServiceLocatorInitializer>()));
}
foreach (var serviceLocatorInitializer in _serviceLocatorInitializers)
{
try
{
var initializer = (IServiceLocatorInitializer)Activator.CreateInstance(serviceLocatorInitializer);
initializer.Initialize(serviceLocator);
}
catch (Exception ex)
{
throw Log.ErrorAndCreateException<Exception>(ex, "Failed to initialize service locator using initializer '{0}'", serviceLocatorInitializer.GetSafeFullName(false));
}
}
}
return serviceLocator;
}
}
#endregion