RegisterMvcAttributeFilterProvider的简单注入器不会注入自定义属性

时间:2014-01-21 16:43:19

标签: c# asp.net-mvc-4 action-filter simple-injector

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

我的行动代码就像这样

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;

public class UserProfileProc : ActionFilterAttribute 
{
  public IUserProfile UserProfile {get;set;}

  public override void OnActionExecuting(ActionExecutingContext filterContext)
  {
    var response = filterContext.HttpContext.Response;
    UserLoginInfo userinfo = UserProfile.GetUserInfo(); .....
  } 
}

更新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(); .....
  } 
}

My Injector Simple Injector Initializer类是

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

1 个答案:

答案 0 :(得分:0)

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

有关将RegisterMvcAttributeFilterProvider隐式属性注入一起使用的替代方法,请查看此Stackoverflow Q/A。有关Simple Injector中属性注入的更多信息,请阅读this wiki