【问题标题】:How do I Access the RequestContext Outside the Controller?如何访问控制器外部的 RequestContext?
【发布时间】:2010-09-15 22:30:31
【问题描述】:

背景

我正在尝试将业务逻辑从控制器移到它们自己的服务中。

控制器

public class AccountController : Controller
{
    private readonly IAccountService _accountService; 

    public AccountController(IAccountService accountService)
    {
        _accountService = accountService;
    }

    ....
}

我正在使用 Unity 注入依赖项。我想在IAccountService 的实现中使用Url.GenerateUrl() 辅助方法,但Url 是针对控制器的属性。

我查看了 MVC 源代码以了解这是如何完成的,但它需要我从控制器外部访问 RequestContext,我不知道该怎么做。

问题

如何从控制器外部访问 RequestContext?如果这不能解决我的问题,我该如何解决我的设置问题?

【问题讨论】:

    标签: asp.net-mvc dependency-injection urlhelper requestcontext


    【解决方案1】:

    这可能不太正确,因为我目前无法对其进行测试,但我认为您可以在 .NET 4+ 中执行类似的操作:

    using System.Web;
    using System.Web.Mvc;
    
    // ...
    
    var helper = new UrlHelper(HttpContext.Current.Request.RequestContext);
    string url = helper.GenerateUrl(/* ... */);
    

    可能将上下文从控制器传递到您的IAccountService 实现而不是直接从HttpContext.Current 获取它更有意义。

    【讨论】:

    • 正如@LukeH 建议的那样,将 UrlHelper 的实例传递给您的 AccountService 要容易得多。
    • @user155899:那么您大概使用的是 .NET 3.5?我认为RequestContext 属性是在 .NET 4 中引入的。
    • @user155899:不用担心。无论如何,达林的答案是更好的答案。
    • @nfplee - 我做了一个小修改,以便您可以更改投票。
    【解决方案2】:

    但是我想在 IAccountService 的实现中使用 Url.GenerateUrl 辅助方法

    只需将此信息作为参数传递。示例:

    public ActionResult Index()
    {
        var someUrl = Url.Action("about");
        _accountService.Foo(someUrl);
    }
    

    现在您的服务类中不再需要 UrlHelper。任何需要与 MVC 基础设施交互的东西都不应该放在你的服务类中。它们不应该依赖于任何请求、响应、会话……控制器负责处理这些对象并将它们与您的服务类粘合在一起。

    【讨论】:

    • 嗨,我认为这是要走的路。谢谢
    • 这应该会得到更多的支持。 HttpContext 不应在服务层中使用(如下面的答案所示)。当您想在无法访问 HttpContext 或具有不同端点 URL 的 Restful API 的应用程序中使用您的服务时会发生什么?
    猜你喜欢
    • 1970-01-01
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    • 2013-10-08
    • 2019-01-27
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    相关资源
    最近更新 更多