ロギング、トレース、例外処理などを処理するために AOP フレームワークを使用することを検討しています。PostSharp を使用してプロトタイプを作成しましたが、今は AspectMap を使用して同じ機能を作成しようとしています。
簡単に言うと、ASP.NET MVC 3 アプリケーションがあり、コントローラー メソッドに簡単にアタッチして、開始、終了、実行時間、および引数の値を表示できるアスペクトが必要です。私の PoC は、基本的な MVC 3 インターネット アプリケーション テンプレートです ([ファイル] > [新規] > [プロジェクト] > [Web] > [ASP.NET MVC 3 Web アプリケーション] > [インターネット])。今までやってきたこと…
AspectsRegistry を作成しました
public class PoCRegistry : AspectsRegistry
{
public PoCRegistry()
{
ForAspect<ProfileAttribute>().HandleWith<ProfileHandler>();
}
}
StructureMapControllerFactory を作成しました
public class StuctureMapControllerFactory : DefaultControllerFactory
{
protected override IController GetControllerInstance( RequestContext requestContext, Type controllerType )
{
if( controllerType == null ) return null;
try
{
return ObjectFactory.GetInstance( controllerType ) as Controller;
}
catch( StructureMapException )
{
Debug.WriteLine( ObjectFactory.WhatDoIHave() );
throw;
}
}
}
すべてをApplication_Startに登録しました
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters( GlobalFilters.Filters );
RegisterRoutes( RouteTable.Routes );
ObjectFactory.Initialize( ie => ie.AddRegistry( new PoCRegistry() ) );
ControllerBuilder.Current.SetControllerFactory( new StuctureMapControllerFactory() );
}
この時点で、アプリケーションは動作し、StructureMapControllerFactory を使用してコントローラーを構築していることがわかります (デバッガーがそのコードにステップインします)。問題は、生成されたコントローラーをどこで、またはどのように「強化」するかを理解できないことです。チュートリアルでは、次のようなものを使用する必要があると書かれています。
For<ICaseController>()
.Use<CaseController>()
.EnrichWith( AddAspectsTo<CaseController> );
しかし、AspectRegistry に入るチュートリアルでは、レジストリはコントローラー要求の解決に責任を負わないため、この状況では適切な場所とは思えませんが、コントローラー ファクトリはそうです。残念ながら、コントローラ ファクトリの GetInstance() メソッドは を返しobject
、EnrichWith() メソッドは を必要としSmartInstance
ます。
この時点で私は立ち往生しています。ヒント、ポインタ、または支援をいただければ幸いです。