![](/img/trans.png)
[英]Property injection failing with both Ninject and Simple 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.