动作filter上的简单注入属性注入

我要注入的动作filter就像这样开始

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

我已经像这样设置了我的容器:

 container.Register<IWcfClientProxy>( ()=> new WcfClientProxy()); container.RegisterInitializer(handler => { handler.FrameworkServiceProxy = container .GetInstance<IWcfClientProxy>(); }); 

当我运行它时, FrameworkServiceProxy属性为null。

我读过这篇文章: Simple Injector:在基类中注入一个属性并按照答案。 我还在本页简单注射器文档中阅读了示例。

我不是注入基类,也许这就是问题所在?

##更新##

我正在添加更多信息,因为我认为它应该是根据史蒂文斯的回答所说的。

我正在使用NuGet包用于MVC 3.这将以下内容添加到应用程序中:

 public static class SimpleInjectorInitializer { /// Initialize the container and register it as MVC3 Dependency Resolver. 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>(() => new WcfClientProxy()); container.RegisterInitializer(handler => { handler.FrameworkServiceProxy = container.GetInstance<IWcfClientProxy>(); }); } 

这包括container.RegisterMvcAttributeFilterProvider(); 我现在明白它应该注册一个filter提供者,并且应该意味着通过容器创建filter(这种理解可能是错误的),然后属性自动连线。

我的filter在Global.asax.cs中注册,如下所示:

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

在我看来,filter不是由容器创建的,所以我认为我需要做一些其他事情才能实现这一点?

您正在UserAuthorisation属性上注册初始值设定项。 但是,初始化程序仅在容器本身创建类型时由容器使用。 由于属性是由CLR创建的,因此初始化程序不会关闭。

SimpleInjector.Integration.Web.Mvc.dll( 此NuGet包 )包含RegisterMvcAttributeFilterProvider扩展方法。 这将注册一个AttributeFilterProvider ,它将执行隐式属性注入(并调用container.InjectProperties方法)。 在调用container.RegisterMvcAttributeFilterProvider() ,您将看到自动注入此属性。

我选择了Stevens作为答案,因为它让我得到了一个解决方案,我现在正在使用他在评论中提到的命令处理程序。

我已经做了一个简单的工作来注入我的全局filter。

在App_Start \ SimpleInjectorInitializer.cs中,我添加了RegisterGlobalFilters如下所示:

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

Initialize方法中,我添加了这个RegisterGlobalFilters(GlobalFilters.Filters, container);

完整的方法如下所示:

 /// Initialize the container and register it as MVC3 Dependency Resolver. 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,这可能是一件好事。