在Global.asax中注入依赖项似乎并不总是有效。 有时会这样,有时我会得到一个ContextDisposedException (看起来当我在做Page.Redirect时会出现问题吗?)。我在 ASP.NET WebForm 上下文中。
这是我的代码:
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中,Mark Seemann说不应该在global.asax中使用依赖注入,因为global.asax是 Composition Root 。
那么解决我问题的最佳方法是什么,因为我不想直接调用我的UserManager,因为构造函数需要一个存储库
public UserManager(IGenericRepository repository) : base(repository)
{
}
并且GenericRepository
本身就是一个需要IContext
public GenericRepository(IContext context)
{
}
我可能会new UserManager(new GenericRepository(new MyContext))
但
就像一个信息,目前我正在注入这样的上下文:
// 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>(); }
}
答案 0 :(得分:2)
在这种情况下,您可以构建您的Ninject容器,并将其用作此特定实例的服务定位器(因为您在组合根目录中 - 此时无法注入任何内容)。