2014-01-21 61 views
0

我將當前項目從AutoFac轉換爲簡單注入器,但我不能讓它適用於我的MVC操作篩選器。我的UserProfileProc屬性類包含IUserProfile類型的UserProfile,但它未注入;其值爲空。簡單注射器與RegisterMvcAttributeFilterProvider不注入自定義屬性

這樣

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

更新1我的行動代碼:運行時UserProfile.GetUserInfo我 改變IUserProfile作爲公共財產,這說的是空();

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

我的噴油器噴油器的簡單初始化器類是

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

你們沒有UserProfileProc定義UserProfile作爲一個屬性,它不公開。當您調用RegisterMvcAttributeFilterProvider時,只有具有公共實例的公共實例屬性纔會注入到屬性中。所有其他的事情只是默默地被忽略。

有關使用RegisterMvcAttributeFilterProvider隱式屬性注入的替代方法,請查看此Stackoverflow Q/A。有關簡單注射器中的特性注射的更多信息,請閱讀this wiki

+0

我改變了這樣的代碼:public IUserProfile UserProfile {get; set;},現在UserProfile是公共屬性,但是當我測試時我得到UserProfileis爲null。 – Ericyu67

+0

@ Ericyu67當你直接從容器請求'IUserProfile'時會發生什麼?例如:'container.GetInstance ()'。這是否會拋出異常? – Steven

+0

目前,我的臨時解決方案就像你說的,它確實有效。但它看起來不好的代碼,如果可能的話,我想做注射工作。 – Ericyu67