簡體   English   中英

在動作過濾器上進行簡單的Injector屬性注入

[英]Simple Injector property injection on action filter

我要注入的動作過濾器是這樣啟動的

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:在基類中注入一個屬性,並遵循答案。 我還在本頁Simple Injector文檔中閱讀了示例。

我沒有注入基類,也許這是問題所在嗎?

##更新##

我正在添加更多信息,因為我認為它應該根據史蒂文斯答案中所說的起作用。

我正在為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());
}

在我看來,過濾器不是由容器創建的,所以我認為我需要做其他事情才能使這種情況發生?

我選擇了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,這可能是一件好事。

您正在您的UserAuthorisation屬性上注冊一個初始化程序。 但是,初始化器僅在由容器本身創建類型時才由容器使用。 由於屬性是由CLR創建的,因此初始化程序不會關閉。

SimpleInjector.Integration.Web.Mvc.dll( 此NuGet包 )包含RegisterMvcAttributeFilterProvider擴展方法。 這將注冊一個AttributeFilterProvider ,它將進行隱式屬性注入(並調用container.InjectProperties方法)。 調用container.RegisterMvcAttributeFilterProvider() ,您將看到該屬性被自動注入。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM