Простой инжектор с RegisterMvcAttributeFilterProvider не вводит в настраиваемый атрибут

Я конвертирую текущий проект из AutoFac в Simple Injector, но не могу заставить его работать для моего фильтра действий MVC. Мой класс атрибутов UserProfileProc содержит UserProfile типа IUserProfile, но не внедряется в него; его значение равно нулю.

Мой код действия, подобный этому

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

Обновление 1: я изменяю IUserProfile как общедоступное свойство, которое имеет значение null при запуске 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(); .....
  } 
}

Обновление 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(); .....
  } 
}

Мой класс 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>();
        ....
    }
}

person Ericyu67    schedule 21.01.2014    source источник


Ответы (1)


Вы не определили UserProfile как свойство UserProfileProc, и оно не является общедоступным. Только общедоступные свойства экземпляра с общедоступным сеттером внедряются в атрибуты при вызове RegisterMvcAttributeFilterProvider. Все остальное просто молча игнорируется.

Альтернативный подход к использованию RegisterMvcAttributeFilterProvider с неявным внедрением свойств см. в этом Stackoverflow Q/A. Для получения дополнительной информации о внедрении свойств в Simple Injector прочитайте эту вики.

person Steven    schedule 21.01.2014
comment
Я изменил код следующим образом: public IUserProfile UserProfile {get;set;}, теперь UserProfile является общедоступным, но при тестировании я получаю значение UserProfile равно null. - person Ericyu67; 22.01.2014
comment
@Ericyu67 Ericyu67 А что происходит, когда вы запрашиваете IUserProfile непосредственно из контейнера? Например: container.GetInstance<IUserProfile>(). Это вызывает исключение? - person Steven; 22.01.2014
comment
В настоящее время мое временное решение, как вы сказали, работает. Но код кажется плохим, я хочу, чтобы инъекция работала, если это возможно. - person Ericyu67; 22.01.2014
comment
Я изменил свою кодовую базу на ваши первые комментарии, установленные как общедоступная собственность, но идентификатор не работает. Поэтому я использую свое временное решение в Update2. Оно работает, но код, как я уже сказал, кажется таким плохим. - person Ericyu67; 22.01.2014