2013-05-29 92 views
1

在Global.asax中注入依賴項似乎並不總是奏效。 有時候它會,有時我會得到一個ContextDisposedException(看起來問題出現在我做Page.Redirect?時)。我在一個ASP.NET WebForm上下文中。向global.asax中注入依賴項

這裏是我的代碼:

public class Global : HttpApplication 
{ 
    [Inject] 
    public UserManager UserManager { get; set; } 

    private void Application_PostAuthenticateRequest(object sender, EventArgs e) 
    { 
     if (User.Identity.IsAuthenticated) 
     { 
      GlobalSecurityContext.SetPrincipal(User); 

      string path = Request.AppRelativeCurrentExecutionFilePath; 
      if (path.Contains(".aspx")) 
      { 
       // Get the current user 
       var userData = UserManager.GetByIdWithLogin(User.Identity.Name); 
       if (userData != null) 
       { 
        LoginDataDTO data = userData.LoginData; 
        if (data.XXX && ...) 
        { 
         Response.Redirect(...); 
        } 
       } 
      } 
     } 
    } 

    protected void Session_End(Object sender, EventArgs e) 
    { 
     UserManager.Logout(); 
    } 
} 

在這篇文章中How to inject dependencies into the global.asax.cs,馬克西曼說,因爲Global.asax的IS的成分根一個不應該使用依賴注入在Global.asax中。

那麼,什麼是解決我的問題,因爲我不希望直接叫我的UserManager因爲構造函數需要一個倉庫

public UserManager(IGenericRepository repository) : base(repository) 
{ 
} 

GenericRepository具有本身需要一個IContext

構造做的最好辦法
public GenericRepository(IContext context) 
{ 
} 

我大概可以做new UserManager(new GenericRepository(new MyContext))

  1. 我不會重用整個請求
  2. 我需要在我的GUI AccessLayer添加引用同樣的背景下,我想避免

只是作爲一個信息,目前我像這樣注入上下文:

// Dynamically load the context so that we dont have a direct reference on it! 
string contextType = // read type from web.config 
if (!String.IsNullOrEmpty(contextType)) 
{ 
    Type context = Type.GetType(contextType); 
    Bind<IContext>().To(context).InRequestScope(); 
} 

任何幫助將不勝感激!

[編輯]:

改變這樣的UserProperty屬性的工作原理:

public UserManager UserManager 
{ 
    get { return ServiceLocator.Current.GetInstance<UserManager>(); } 
} 
+3

我同意Global.asax是入口點 - 成分根。你在那裏連接你的依賴關係,所以你不能*注入*任何東西。我只是使用你的IoC容器的'Resolve'方法來獲取你需要的實例。 –

+0

這就像是問,我爲什麼不能在創建它之前使用DI容器:-P – Steven

+0

Steven:DI容器是在OnStart中創建的,所以它應該在我的PostAuthenticate方法中可用,不是嗎?正如我寫的,大部分時間這個代碼正在工作......它有時只是失敗。 – Bidou

回答

2

在這種情況下,你可以建立自己的Ninject容器,使用它的服務定位器爲這個特殊的實例(因爲你在組合根目錄中 - 此時你不能注入任何東西)。