1

ベースコントローラーにLogger属性を配置しました。この LoggerAttribute は次のようになります。

public class LoggerAttribute: InjectableFilterAttribute
{
    public override Type FilterType
    {
        get { return typeof (LoggerActionFilter); }
    }
}

この logger 属性の ctor はヒットしますが、FilterType ゲッターはヒットしません。

フィルター自体の関連部分は次のようになります。

public class LoggerActionFilter: IActionFilter
{
    private readonly ILoggerService logger;

    public LoggerActionFilter (ILoggerService logger)
    {
        this.logger = logger;
    }
    <IActionFilter Implementeation>
}

フィルターの ctor もヒットしません。

私のサービスの接続とサービスロケータのインスタンス化については、ここ
を確認してください ILoggerService の登録はここにあります

私は何が欠けていますか?

4

2 に答える 2

1

いくつか質問があります。

  • どのバージョンの MVC を使用していますか? v1またはv2? v2 の場合、RC または beta2 ですか?
  • Filter Injection サンプルを見たことがありますか?
于 2009-12-27T15:12:09.987 に答える
1

アプリケーションに対して正しい ControllerFactory が設定されていれば、これは自動的に機能するはずです。

私が知る限り、これは TurbineControllerFactory または派生クラスのインスタンスである必要があります。TurbineControllerFactory は、正しいフィルターの検索を担当する TurbineActionInvoker をセットアップします。

カスタム IControllerFactory を DI コンテナー (タービン用語ではサービス ロケーター) に登録する場合、代わりにこの IControllerFactory タイプが使用され、これが TurbineControllerFactory から派生しない場合、TurbineActionInvoker のインスタンスが作成されたコントローラーに割り当てられないことに注意してください。 - これもまた、InjectableFilterAttribute が呼び出されないことを意味します。

Turbine アプリケーションを構成する意図した方法は、TurbineApplication から派生するカスタム アプリケーション クラスを定義することです。

例として、Turbine 構成の Global.asax の内容全体を次に示します。

<%@ Application Codebehind="Global.asax.cs" Inherits="MyApplication" Language="C#" %>

ただし、Global.asax.cs がないことに注意してください。

MyApplication クラスは TurbineApplication から派生し、DI コンテナーを正しく構成する必要があります。これを行う1つの方法は次のとおりです。

public class MyApplication : TurbineApplication
{
    static MyApplication()
    {
        ServiceLocatorManager.SetLocatorProvider(() => new WindsorServiceLocator());
    }
}

明らかに、別の DI コンテナーを使用する場合は、WindsorServiceLocator を別の DI コンテナーに置き換えることができます。

于 2009-12-24T15:36:33.357 に答える