2014-01-21 3 views
0

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

Мой Действие подобный код

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

Update 1: меняю IUserProfile в государственной собственности, в котором говорилось, равна нулю при запуске 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: Мое текущее решение является температура:

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

ответ

0

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

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

+0

Я изменил код следующим образом: public IUserProfile UserProfile {get; set;}, теперь UserProfile является общедоступным, но при тестировании я получаю UserProfileis null. – Ericyu67

+0

@ Ericyu67 И что происходит, когда вы запрашиваете «IUserProfile» непосредственно из контейнера? Например: 'container.GetInstance ()'. Вызывает ли это исключение? – Steven

+0

В настоящее время мое временное решение похоже на то, что вы сказали, оно действительно работает. Но это плохой код, я хочу сделать инъекционную работу, если это возможно. – Ericyu67