C# 简单喷油器性能注入作用过滤器
我想要注入的动作过滤器是这样开始的C# 简单喷油器性能注入作用过滤器,c#,.net,asp.net-mvc-3,dependency-injection,simple-injector,C#,.net,Asp.net Mvc 3,Dependency Injection,Simple Injector,我想要注入的动作过滤器是这样开始的 public class UserAuthorisation : AuthorizeAttribute { public IWcfClientProxy<IAppFrameworkServiceChannel> FrameworkServiceProxy { get; set; } 这包括容器。RegisterMvcAttributeFilterProvider()我现在理解它应该注册一个过滤器提供程序,这意味着过滤器是通
public class UserAuthorisation : AuthorizeAttribute
{
public IWcfClientProxy<IAppFrameworkServiceChannel>
FrameworkServiceProxy { get; set; }
这包括容器。RegisterMvcAttributeFilterProvider()代码>我现在理解它应该注册一个过滤器提供程序,这意味着过滤器是通过容器创建的(这种理解可能是错误的),然后属性会自动连接起来
我的过滤器已在Global.asax.cs中注册,如下所示:
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new UserAuthorisation());
}
在我看来,筛选器不是由容器创建的,因此我想我需要做些其他事情来实现这一点?您正在用户授权属性上注册初始值设定项。但是,只有在容器本身创建类型时,容器才使用初始值设定项。因为属性是由CLR创建的,所以初始值设定项不会关闭
SimpleInjector.Integration.Web.Mvc.dll()包含一个RegisterMvcAttributeFilterProvider
扩展方法。这将注册一个AttributeFilterProvider
,它将执行隐式属性注入(并调用容器.InjectProperties
方法)。调用container.RegisterMvcAttributeFilterProvider()
后,您将看到自动注入此属性。我选择Stevens answer作为答案,因为它让我找到了解决方案,我现在正在使用他在注释中提到的命令处理程序
我已经做了一个简单的工作,让我的全球过滤器注入
在App_Start\SimpleInjectorInitializer.cs中,我添加了RegisterGlobalFilter
,如下所示:
container.Register<IWcfClientProxy<IAppFrameworkServiceChannel>>(
()=> new WcfClientProxy<IAppFrameworkServiceChannel>());
container.RegisterInitializer<UserAuthorisation>(handler =>
{
handler.FrameworkServiceProxy = container
.GetInstance<IWcfClientProxy<IAppFrameworkServiceChannel>>();
});
public static void RegisterGlobalFilters(GlobalFilterCollection filters, Container container)
{
//Add simple injector resolved types.
filters.Add(container.GetInstance<UserAuthorisation>());
}
/// <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);
}
就像我说的,很简单。只需从simple injector获取我的实例,然后将它们添加到全局列表中,我相信有更好的方法可以做到这一点
这种方式意味着您不需要更改global.asax.cs,这可能是一件好事。如何注册您的用户授权?您是否将其添加到global Filter或Simple Injector有一个filterprovider?我通过global filters添加了它,这是我出错的地方吗?是的,这就是问题所在。如果未通过Simple Injector解决UserAuthorization
,Simple Injector将不知道您的过滤器,因此无法执行属性注入…好的,很酷,您想将其放入答案中吗?可能会显示Simple Injector过滤器提供程序的示例,我会接受它(如果它对我有效:))。我把你的答案简化了一点。这应该完全相同,但代码更少。如果这不起作用,请随时回滚我的编辑。谢谢,我再次更新了它,因此所有内容都在SimpleInjectorInitializer类中,因此,现在对global.asax.cs没有任何更改。注意:RegisterMvcAttributeFilterProvider
现在已过时,并被RegisterMvcIntegratedFilterProvider
所取代:我们不赞成使用此选项:
/// <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);
}