[英]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.