6

注入したいアクションフィルターはこんな感じで始まります

public class UserAuthorisation : AuthorizeAttribute
{
    public IWcfClientProxy<IAppFrameworkServiceChannel>
        FrameworkServiceProxy { get; set; }

私は次のようにコンテナを設定しました:

container.Register<IWcfClientProxy<IAppFrameworkServiceChannel>>(
    ()=> new WcfClientProxy<IAppFrameworkServiceChannel>());

container.RegisterInitializer<UserAuthorisation>(handler =>
{
    handler.FrameworkServiceProxy = container
       .GetInstance<IWcfClientProxy<IAppFrameworkServiceChannel>>();
});

これを実行すると、FrameworkServiceProxyプロパティはnullになります。

私はこの投稿を読みました:Simple Injector:基本クラスにプロパティを注入し、答えに従いました。このページのSimpleInjectorDocumentationの例も読みました。

私は基本クラスに注入していません、そして多分それは問題ですか?

## アップデート ##

スティーブンスの回答で述べられていることからうまくいくはずだと思うので、私はより多くの情報を追加しています。

MVC 3用のNuGetパッケージを使用しています。これにより、アプリケーションに以下が追加されます。

public static class SimpleInjectorInitializer
{
    /// <summary>Initialize the container and register it as MVC3 Dependency Resolver.</summary>
    public static void Initialize()
    {
        var container = new Container();
        InitializeContainer(container);
        container.RegisterMvcControllers(Assembly.GetExecutingAssembly());
        container.RegisterMvcAttributeFilterProvider();
        container.Verify();
        DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
    }

    private static void InitializeContainer(Container container)
    {
        container.Register<IWcfClientProxy<IAppFrameworkServiceChannel>>(() => new WcfClientProxy<IAppFrameworkServiceChannel>());
        container.RegisterInitializer<UserAuthorisation>(handler =>
            {
                handler.FrameworkServiceProxy = container.GetInstance<IWcfClientProxy<IAppFrameworkServiceChannel>>();
            });
    }

これにはcontainer.RegisterMvcAttributeFilterProvider();、フィルタープロバイダーを登録する必要があり、フィルターがコンテナーを介して作成され(この理解は間違っている可能性があります)、プロパティが自動的に接続されることを意味する必要があることを理解していることも含まれます。

私のフィルターは次のようにGlobal.asax.csに登録されています。

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new HandleErrorAttribute());
    filters.Add(new UserAuthorisation());
}

フィルタはコンテナによって作成されていないように思われるので、それを実現するには何か他のことをする必要があると思いますか?

4

2 に答える 2

5

解決策にたどり着いたので、Stevensの回答を回答として選択しました。現在、彼がコメントで言及したコマンドハンドラーを使用しています。

グローバルフィルターを挿入するために、簡単な回避策を講じました。

App_Start\SimpleInjectorInitializer.cs に、次のRegisterGlobalFiltersように追加しました。

public static void RegisterGlobalFilters(GlobalFilterCollection filters, Container container)
{
    //Add simple injector resolved types.
    filters.Add(container.GetInstance<UserAuthorisation>());
}

そして、Initialize私がこれを追加した方法でRegisterGlobalFilters(GlobalFilters.Filters, container);

完全なメソッドは次のようになります。

/// <summary>Initialize the container and register it as MVC3 Dependency Resolver.</summary>
public static void Initialize()
{
    var container = new Container();
    InitializeContainer(container);
    container.RegisterMvcControllers(Assembly.GetExecutingAssembly());
    container.RegisterMvcAttributeFilterProvider();
    container.Verify();
    DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));

    RegisterGlobalFilters(GlobalFilters.Filters, container);
}

私が言ったように、非常に単純です。単純なインジェクターからインスタンスを取得し、それらをグローバル リストに追加するだけです。これを行うためのより良い方法があると確信しています。

この方法は、おそらく良いことである global.asax.cs を変更する必要がないことを意味します。

于 2012-08-24T09:11:43.810 に答える
3

属性に初期化子を登録していUserAuthorisationます。ただし、イニシャライザーは、コンテナー自体によってタイプが作成された場合にのみ、コンテナーによって使用されます。属性はCLRによって作成されるため、初期化子はオフになりません。

SimpleInjector.Integration.Web.Mvc.dll(このNuGetパッケージ)には、RegisterMvcAttributeFilterProvider拡張メソッドが含まれています。これにより、AttributeFilterProvider暗黙のプロパティインジェクションを実行する(そしてcontainer.InjectPropertiesメソッドを呼び出す)が登録されます。を呼び出すとcontainer.RegisterMvcAttributeFilterProvider()、このプロパティが自動的に挿入されることがわかります。

于 2012-08-23T07:57:10.780 に答える