// Copyright (c) Microsoft Corporation. All rights reserved. See License.txt in the project root for license information.
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.Linq;
using System.Reflection;
using System.Web.Mvc.Properties;
namespace System.Web.Mvc
{
public class DependencyResolver
{
private static DependencyResolver _instance = new DependencyResolver();
private IDependencyResolver _current;
///
/// Cache should always be a new CacheDependencyResolver(_current).
///
private CacheDependencyResolver _currentCache;
public DependencyResolver()
{
InnerSetResolver(new DefaultDependencyResolver());
}
public static IDependencyResolver Current
{
get { return _instance.InnerCurrent; }
}
internal static IDependencyResolver CurrentCache
{
get { return _instance.InnerCurrentCache; }
}
public IDependencyResolver InnerCurrent
{
get { return _current; }
}
///
/// Provides caching over results returned by Current.
///
internal IDependencyResolver InnerCurrentCache
{
get { return _currentCache; }
}
public static void SetResolver(IDependencyResolver resolver)
{
_instance.InnerSetResolver(resolver);
}
public static void SetResolver(object commonServiceLocator)
{
_instance.InnerSetResolver(commonServiceLocator);
}
[SuppressMessage("Microsoft.Design", "CA1006:DoNotNestGenericTypesInMemberSignatures", Justification = "This is an appropriate nesting of generic types.")]
public static void SetResolver(Func getService, Func> getServices)
{
_instance.InnerSetResolver(getService, getServices);
}
public void InnerSetResolver(IDependencyResolver resolver)
{
if (resolver == null)
{
throw new ArgumentNullException("resolver");
}
_current = resolver;
_currentCache = new CacheDependencyResolver(_current);
}
public void InnerSetResolver(object commonServiceLocator)
{
if (commonServiceLocator == null)
{
throw new ArgumentNullException("commonServiceLocator");
}
Type locatorType = commonServiceLocator.GetType();
MethodInfo getInstance = locatorType.GetMethod("GetInstance", new[] { typeof(Type) });
MethodInfo getInstances = locatorType.GetMethod("GetAllInstances", new[] { typeof(Type) });
if (getInstance == null ||
getInstance.ReturnType != typeof(object) ||
getInstances == null ||
getInstances.ReturnType != typeof(IEnumerable