ASP.NET MVCのIresolver<br>インタフェース
8461 ワード
ASP.NET MVCのソースには、ControllerBuilder、ControllerFactory、Filters、ViewEnginesなどのエンティティオブジェクトがあります.キーワードnewで直接エンティティを作成するのではなく、Iresolverインタフェースに依頼します.また、Iresolverインタフェース自体も簡単で、フレームワークの拡張性も向上します.Iresolverはinternalなので、外部に漏れることはなく、外部のプログラムでは呼び出せないはずです.
(GetValueFromResolver)ではLazyクラスの新しいインスタンスが構築されています.パラメータはTServiceの戻り値を持つ委任GetValueFromResolverメソッドです.CurrentValueThunkもTServiceの戻り値を持つ委任方法です.defaultValueはTServiceのデフォルト値で、この3つのフィールドは対応するIresolverインタフェースのCurrentです.GetValueFromResolverメソッドで最初に呼び出されたのはDependencyResolverである.CurrentクラスのGetServices();コンストラクション関数のcallerMethodNameは、GetValue FromResolverメソッドのエラーを記録する例外情報です.
DependencyResolver依存解析クラス
DependencyResolverの役割はmsdn上でこのように注釈されている:“System.Web.Mvc.IDependencyResolverまたは公共サービスロケータIServiceLocatorインタフェースを実現する依存関係解析プログラムに登録ポイントを提供する.”IDependencyResolverインタフェースには2つの方法しかなく、主な密度はサービスオブジェクト(object GetService(Type serviceType);または、サービスオブジェクトのリスト(IEnumerable
internal interface IResolver<T>
{
T Current { get; }
}
ソースコードにIresolverインタフェースを実装したクラスは2つあり、SingleServiceResolverとMultiServiceResolverで、最も多く使われているのは主にSingleServiceResolverクラスです internal class SingleServiceResolver<TService> :IResolver<TService> where TService : class
{
.......
public TService Current
{
get { return _currentValueFromResolver.Value ?? _currentValueThunk() ?? _defaultValue; }
}
.......
}
SingleServiceResolverでインタフェースを実装する方法は簡単です.このコードでは_currentValueFromResolver,_currentValueThunk,_defaultValueフィールドの割り当ては、SingleServiceResolverコンストラクション関数にあります. public SingleServiceResolver(Func<TService> currentValueThunk, TService defaultValue, string callerMethodName)
{
if (currentValueThunk == null){ throw new ArgumentNullException("currentValueThunk");}
if (defaultValue == null){ throw new ArgumentNullException("defaultValue");}
_resolverThunk = () => DependencyResolver.Current;
_currentValueFromResolver = new Lazy<TService>(GetValueFromResolver);
_currentValueThunk = currentValueThunk;
_defaultValue = defaultValue;
_callerMethodName = callerMethodName;
}
private TService GetValueFromResolver()
{
TService result = _resolverThunk().GetService<TService>();
if (result != null && _currentValueThunk() != null){
throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture, MvcResources.SingleServiceResolver_CannotRegisterTwoInstances, typeof(TService).Name.ToString(),
_callerMethodName));
}
return result;
}
コンストラクション関数で_CurrentValueFromResolver=new LazyDependencyResolver依存解析クラス
DependencyResolverの役割はmsdn上でこのように注釈されている:“System.Web.Mvc.IDependencyResolverまたは公共サービスロケータIServiceLocatorインタフェースを実現する依存関係解析プログラムに登録ポイントを提供する.”IDependencyResolverインタフェースには2つの方法しかなく、主な密度はサービスオブジェクト(object GetService(Type serviceType);または、サービスオブジェクトのリスト(IEnumerable