Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 简单喷油器性能注入作用过滤器_C#_.net_Asp.net Mvc 3_Dependency Injection_Simple Injector - Fatal编程技术网

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);
}