Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.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# 带有RegisterMvcAttributeFilterProvider的简单注入器不注入自定义属性_C#_Asp.net Mvc 4_Action Filter_Simple Injector - Fatal编程技术网

C# 带有RegisterMvcAttributeFilterProvider的简单注入器不注入自定义属性

C# 带有RegisterMvcAttributeFilterProvider的简单注入器不注入自定义属性,c#,asp.net-mvc-4,action-filter,simple-injector,C#,Asp.net Mvc 4,Action Filter,Simple Injector,我正在将当前的项目从AutoFac转换为Simple Injector,但我无法使它适用于我的MVC操作过滤器。MyUserProfileProc属性类包含类型为IUserProfile的UserProfile,但未将其注入;它的值为空 我的动作代码是这样的 public class UserProfileProc : ActionFilterAttribute { IUserProfile UserProfile; public override void OnActionExecu

我正在将当前的项目从AutoFac转换为Simple Injector,但我无法使它适用于我的MVC操作过滤器。My
UserProfileProc
属性类包含类型为
IUserProfile
UserProfile
,但未将其注入;它的值为空

我的动作代码是这样的

public class UserProfileProc : ActionFilterAttribute 
{
  IUserProfile UserProfile;
  public override void OnActionExecuting(ActionExecutingContext filterContext)
  {
    var response = filterContext.HttpContext.Response;
    UserLoginInfo userinfo = UserProfile.GetUserInfo(); .....
  } 
}
更新1: 我将IUserProfile更改为公共属性,当运行UserProfile.GetUserInfo()时,该属性表示为null

更新2: 我目前的临时解决方案是:

public class UserProfileProc : ActionFilterAttribute 
{
  public IUserProfile UserProfile { 
      get { 
          return DependencyResolver.Current.GetService<IUserServer>(); 
          } 
    }

  public override void OnActionExecuting(ActionExecutingContext filterContext)
  {
    var response = filterContext.HttpContext.Response;
    UserLoginInfo userinfo = UserProfile.GetUserInfo(); .....
  } 
}
公共类UserProfileProc:ActionFilterAttribute
{
公共IUserProfile用户配置文件{
获取{
返回DependencyResolver.Current.GetService();
} 
}
公共覆盖无效OnActionExecuting(ActionExecutingContext filterContext)
{
var response=filterContext.HttpContext.response;
UserLoginInfo userinfo=UserProfile.GetUserInfo()。。。。。
} 
}
我的注入器简单注入器初始化器类是

public static class SimpleInjectorInitializer
{
    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<IAppClientServer, AppClientServer>();
        container.Register<IUserProfile, UserProfile \>();
        container.Register<ILogger, NLogLogger>();
        ....
    }
}
公共静态类SimpleInjector初始值设定项
{
公共静态void Initialize()
{            
var container=新容器();
初始化容器(容器);
container.RegisterMvcControllers(Assembly.getExecutionGassembly());
container.RegisterMvcAttributeFilterProvider();
container.Verify();
DependencyResolver.SetResolver(
新的SimpleInjectorDependencyResolver(容器));
}
私有静态void InitializeContainer(容器)
{          
container.Register();
container.Register();
container.Register();
....
}
}

您没有将
UserProfile
定义为
UserProfileProc
上的属性,并且它不是公共的。调用
RegisterMvcAttributeFilterProvider
时,只有带有公共setter的公共实例属性才会注入属性。所有其他的事情都被默默地忽略了


有关将
RegisterMvcAttributeFilterProvider
与隐式属性注入一起使用的另一种方法,请参阅此。有关Simple Injector中属性注入的详细信息,请阅读。

我更改了如下代码:public IUserProfile UserProfile{get;set;},现在UserProfile是公共属性,但我测试时get UserProfile为null。@Ericyu67当您直接从容器请求
IUserProfile
时会发生什么?例如:
container.GetInstance()
。这会引发异常吗?目前,我的临时解决方案就像你说的那样,确实有效。但这似乎是错误的代码,如果可能的话,我想让注入工作。@Ericyu67:你目前的临时解决方案是什么?在我看来,使用隐式属性注入(可以跳过属性而不会失败)是不好的,因为它导致了现在的情况。在我看来,最好的解决方案是将元数据(属性)从其行为中分离出来。我根据您的第一个注释集更改了代码,将其设置为公共属性,但id不起作用。所以我在Update2中使用了我的临时解决方案,它确实可以工作,但我所说的代码看起来很糟糕。
public static class SimpleInjectorInitializer
{
    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<IAppClientServer, AppClientServer>();
        container.Register<IUserProfile, UserProfile \>();
        container.Register<ILogger, NLogLogger>();
        ....
    }
}