在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))
但
- 我不會重用整個請求
- 我需要在我的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>(); }
}
我同意Global.asax是入口點 - 成分根。你在那裏連接你的依賴關係,所以你不能*注入*任何東西。我只是使用你的IoC容器的'Resolve'方法來獲取你需要的實例。 –
這就像是問,我爲什麼不能在創建它之前使用DI容器:-P – Steven
Steven:DI容器是在OnStart中創建的,所以它應該在我的PostAuthenticate方法中可用,不是嗎?正如我寫的,大部分時間這個代碼正在工作......它有時只是失敗。 – Bidou