1

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

在这篇如何将依赖项注入到 global.asax.cs中,Mark Seemann 说不应在 global.asax 中使用依赖项注入,因为 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>(); }
}
4

1 回答 1

2

在这种情况下,您可以构建您的 Ninject 容器,并将其用作此特定实例的服务定位器(因为您在组合根中 - 此时您无法注入任何东西)。

于 2013-05-29T07:16:22.447 回答