我正在尝试将业务逻辑从控制器转移到他们自己的服务中。
public class AccountController : Controller
{
private readonly IAccountService _accountService;
public AccountController(IAccountService accountService)
{
_accountService = accountService;
}
....
}
我正在使用Unity注入依赖项。我想在Url.GenerateUrl()
的实现中使用IAccountService
辅助方法,但Url
是针对控制器的属性。
我查看了MVC源代码,看看它是如何完成的,但它要求我从控制器外部访问RequestContext
,我不知道该怎么做。
如何从控制器外部访问RequestContext?如果这不能解决我的问题,我如何解决问题?
答案 0 :(得分:44)
这可能不太对,因为我现在无法测试它,但我认为你可以在.NET 4 +中做这样的事情:
using System.Web;
using System.Web.Mvc;
// ...
var helper = new UrlHelper(HttpContext.Current.Request.RequestContext);
string url = helper.GenerateUrl(/* ... */);
可能将上下文从控制器传递到IAccountService
实现更有意义,而不是直接从HttpContext.Current
抓取它。
答案 1 :(得分:15)
但是我想在我的IAccountService实现中使用Url.GenerateUrl帮助器方法
只需将此信息作为参数传递。例如:
public ActionResult Index()
{
var someUrl = Url.Action("about");
_accountService.Foo(someUrl);
}
现在,您的服务类中不再需要UrlHelper。需要与MVC基础架构交互的所有内容都不应放在您的服务类中。它们不应该依赖于任何请求,响应,会话......控制器负责处理这些对象并将它们与您的服务类粘合在一起。