依赖注入global.asax

时间:2013-05-29 06:48:11

标签: c# dependency-injection ninject webforms global-asax

在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))

  1. 我不会为整个请求重复使用相同的上下文
  2. 我需要在GUI中添加一个关于AccessLayer的引用,我想避免使用
  3. 就像一个信息,目前我正在注入这样的上下文:

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

1 个答案:

答案 0 :(得分:2)

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