1

AutoFacを使用してグローバルアクションフィルターを登録するには?
アクション フィルターはアプリケーションの起動時にすべての依存関係グラフが初期化された状態で解決されるため、一般的に推奨されるアプローチ (以下に一覧表示) は正しくないようです。ただし、アクション フィルターが破棄可能なオブジェクト (DB セッションなどの非直接的だがサービス レイヤー経由) を使用する場合、グローバル フィルターは一度作成され、常に存在し、依存するサービスの破棄で再作成されないため、正しく動作しません。

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    var userLocatorFilter = ContainerHolder.Container.Resolve<UserLocatorAttribute>();
    var userStatusFilter = ContainerHolder.Container.Resolve<UserStatusAttribute>();
    var logErrorFilter = ContainerHolder.Container.Resolve<LogErrorAttribute>();
    // or DependencyResolver.Current.GetService<CustomFilterAttribute>()

    filters.Add(userLocatorFilter);
    filters.Add(userStatusFilter);
    filters.Add(logErrorFilter);
}

だから、リクエストごとに再作成/破棄するグローバルフィルター登録/解決プロセスがあるのではないかと思いますか? 言い換えれば、寿命が限られているグローバルフィルターが必要です。

問題の詳細な説明が必要な場合はお知らせください。

4

1 に答える 1

0

使用する場合:

DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

...DependencyResolver.Current.GetService<MyService>()必要なときにいつでもフィルター内で使用できませんか?

別の考えられる解決策は、AutofacContainerを単一の c'tor 依存関係として渡し、そこから必要なサービスを別の .xml で解決することですLifetimeScope

よくContainerHolder.Containerわかりませんが、使用している Autofac のバージョンを知りたいのですが、バージョン 3 とMVC の統合を見たことがありますか?

于 2014-01-22T14:39:37.950 に答える