0
votes

I am converting current project from AutoFac to Simple Injector, but I can't make it work for my MVC action filter. My UserProfileProc attribute class contains a UserProfile of type IUserProfile, but it isn't injected into; its value is null.

My Action code like this

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

Update 1: I change IUserProfile as public property, which said is null when run UserProfile.GetUserInfo();

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

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

Update 2: My current temp solution is:

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 class is

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

1 Answers

0
votes

You didn't define UserProfile as a property on UserProfileProc, and it is not public. Only public instance properties with a public setter are injected into attributes when you called RegisterMvcAttributeFilterProvider. All other things are just silently ignored.

For an alternative approach to using RegisterMvcAttributeFilterProvider with implicit property injection, please take a look at this Stackoverflow Q/A. For more information about property injection in Simple Injector, please read this wiki.