1

ロギング、トレース、例外処理などを処理するために 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ます。

この時点で私は立ち往生しています。ヒント、ポインタ、または支援をいただければ幸いです。

4

2 に答える 2

0

これは、正直言って考えたこともなかったユースケースです。今日はテスト プロジェクトをセットアップして、何ができるか見てみます。我慢して!

アップデート

私はバックエンド コードをいじっており (コードの完全なコピーはhttp://aspectmap.codeplex.comから入手できます)、関連する部分は次のとおりです。

public T AddAspectsTo<T>(T concreteObject)
    {
        ProxyGenerator dynamicProxy = new ProxyGenerator();

        return (T)dynamicProxy.CreateInterfaceProxyWithTargetInterface(typeof(T), concreteObject,
            new[] { (IInterceptor)new AspectInterceptor(attributeMap) });
    }

これは城の動的プロキシのものを使用しています。残念ながら、CreateInterfaceProxy... メソッドでは、(私が望んでいたような基本クラスではなく) インターフェイスを渡す必要があります。今、私はこの質問を見つけました: C# Dynamic Proxy 2 generate proxy from class with code in constructor ? 方法?

これは、CreateClassProxy を使用できる可能性があることを示しているようです。私はまだこれを試す機会がなく、コンピューターから 1 週間離れる予定です。コードプレックスからソースを入手して試してみてください。そうでない場合は、戻ってきたら何かをまとめます。

于 2012-10-22T08:03:09.817 に答える