0

我有一個會員提供程序,它會產生依賴注入的問題。 我想了解它爲什麼會發生在一個類中使用Unity.BuildUp在其他類中破壞注入

這是基本控制器的一些部分。 (它的工作原理像它應該。)

namespace Our.Web.Controllers 
{ 
    public abstract partial class OurBaseController : VABController 
    { 
     //-------------------------------------- 
     // EVENT DECLARATIONS 
     //-------------------------------------- 

     //-------------------------------------- 
     // CLASS CONSTANTS 
     //-------------------------------------- 

     //-------------------------------------- 
     // PRIVATE VARIABLES 
     //-------------------------------------- 

     private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); 

     private UserInfo m_info; 

     //-------------------------------------- 
     // PROTECTED VARIABLES 
     //-------------------------------------- 

     //-------------------------------------- 
     // CONSTRUCTOR & INITIALIZATION 
     //-------------------------------------- 

     protected override void Initialize(System.Web.Routing.RequestContext requestContext) 
     { 
      base.Initialize(requestContext); 

      logger.Debug("Initializing OurBaseController."); 

      m_info = UserInfoAccessor.GetCurrent(); 
     } 

     //-------------------------------------- 
     // GETTER/SETTERS 
     //-------------------------------------- 

     [Dependency] 
     public UserInfoAccessor UserInfoAccessor { get; set; } 

     <snip> 

    } 
} 

這裏是統一登記從Global.asax.cs中的相關部分:

namespace OurWeb 
{ 

    public class MvcApplication : System.Web.HttpApplication, IContainerAccessor 
    { 
     <snip> 

     //-------------------------------------- 
     // GETTER/SETTERS 
     //-------------------------------------- 

     IUnityContainer IContainerAccessor.Container 
     { 
      get { return MvcUnityContainer.Container ; } 
     } 

     //-------------------------------------- 
     // EVENT HANDLERS 
     //-------------------------------------- 

     protected void Application_Start() 
     { 
      AreaRegistration.RegisterAllAreas(); 

      RegisterRoutes(RouteTable.Routes); 

      ConfigureUnity(); 

      <snip> 
     } 

     <snip> 

     //-------------------------------------- 
     // STATIC METHODS 
     //-------------------------------------- 

     <snip> 

     //-------------------------------------- 
     // PRIVATE & PROTECTED INSTANCE METHODS 
     //-------------------------------------- 

     private void ConfigureUnity() 
     { 
      //Create UnityContainer   
      IUnityContainer container = new UnityContainer() 
       <snip> 
       .RegisterType<UserInfoAccessor>() 
       <snip> 

      //Set container for Controller Factory 
      MvcUnityContainer.Container = container; 

      <snip> 

      //Set Controller Factory as UnityControllerFactory 
      ControllerBuilder.Current.SetControllerFactory(
           typeof(UnityControllerFactory)); 
     } 

     <snip> 
    } 
} 

現在,當我添加自定義成員資格提供,我不能注入它,所以我在構造函數中使用了BuildUp。

namespace System.Web.Security 
{ 
    public class OurMembershipProvider : SqlMembershipProvider 
    { 
     //-------------------------------------- 
     // EVENT DECLARATIONS 
     //-------------------------------------- 

     //-------------------------------------- 
     // CLASS CONSTANTS 
     //-------------------------------------- 

     //-------------------------------------- 
     // PRIVATE VARIABLES 
     //-------------------------------------- 

     private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); 

     //-------------------------------------- 
     // PROTECTED VARIABLES 
     //-------------------------------------- 

     //-------------------------------------- 
     // CONSTRUCTOR & INITIALIZATION 
     //-------------------------------------- 

     public OurMembershipProvider() 
      : base() 
     { 
      // Can't inject so we'll ask the container to build the instance. 
      IUnityContainer container = GetUnityContainer(); 
      container.BuildUp(this); 
     } 

     //-------------------------------------- 
     // GETTER/SETTERS 
     //-------------------------------------- 

     [Dependency] 
     public UserInfoAccessor UserInfoAccessor { get; set; } 

     //-------------------------------------- 
     // PUBLIC METHODS 
     //-------------------------------------- 

     public override bool ValidateUser(string username, string password) 
     { 
      //Sufficient for the question. In reality it contains account mapping validation logic. 
      return base.ValidateUser(username, password); 
     } 

     //-------------------------------------- 
     // EVENT HANDLERS 
     //-------------------------------------- 

     //-------------------------------------- 
     // STATIC METHODS 
     //-------------------------------------- 

     //-------------------------------------- 
     // PRIVATE & PROTECTED INSTANCE METHODS 
     //-------------------------------------- 

     private IUnityContainer GetUnityContainer() 
     { 
      var context = HttpContext.Current; 

      if (context == null) 
       throw new Exception("No HttpContext"); 

      var accessor = context.ApplicationInstance as IContainerAccessor; 

      if (accessor == null) 
       throw new Exception("The global HttpApplication instance needs to implement " + typeof(IContainerAccessor).FullName); 

      if (accessor.Container == null) 
       throw new Exception("HttpApplication has no container initialized"); 

      return accessor.Container; 
     } 
    } 
} 

類駐留在MVC的Web項目,所以我只是改變了這樣的web.config中:

<!--<add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider, System.Web" connectionStringName="ApplicationServices" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" passwordFormat="Hashed" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" passwordStrengthRegularExpression="" applicationName="/"/>--> 
<add name="AspNetSqlMembershipProvider" type="System.Web.Security.OurMembershipProvider" connectionStringName="ApplicationServices" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" passwordFormat="Hashed" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" passwordStrengthRegularExpression="" applicationName="/"/> 

現在,當我這樣做,我在得到一個空引用異常這個行上的OurBaseController的構造函數:m_info = UserInfoAccessor.GetCurrent();

當我註冊這個自定義成員資格提供程序時,Unity如何不注入UserInfoAccessor,但是當我回到標準模塊時它工作正常嗎?
BuildUp是否打擾注射?

我沒有在調試器或elmah中得到任何其他例外。

解決方案20110726

時正在建立UnityContainer的自定義成員對象得到了創建。這使得容器不可用,並且初始化期間的異常使得UnityContainer保持不初始化,這是容器不可用的原因。

我從中學到了什麼?
使用統一容器作爲資源定位器是一個充滿蠕蟲的罐頭。

爲什麼我在配置期間錯過了錯誤?
當我啓動該網站時,我的網絡瀏覽器打開了一個新選項卡。我放棄了這一點,並刷新了一個較早的窗口。所以我正在查看網站已經啓動的第二個請求的結果。

+0

在類型聲明中缺少程序集是否正確?!? – PVitt

+0

這是正確的。 –

+0

調用堆棧看起來像什麼? –

回答

1

在設置UnityContainer時創建了自定義成員資格對象。這使得容器不可用,並且初始化期間的異常使得UnityContainer保持不初始化,這是容器不可用的原因。

我從中學到了什麼?
使用統一容器作爲資源定位器是一個充滿蠕蟲的罐頭。

爲什麼我在配置期間錯過了錯誤?
當我啓動該網站時,我的網絡瀏覽器打開了一個新選項卡。我放棄了這一點,並刷新了一個較早的窗口。所以我正在查看網站已經啓動的第二個請求的結果。

相關問題