私はビジネスロジックをコントローラーから独自のサービスに移そうとしています。
_public class AccountController : Controller
{
private readonly IAccountService _accountService;
public AccountController(IAccountService accountService)
{
_accountService = accountService;
}
....
}
_
Unityを使用して依存性を注入しています。 IAccountService
の実装内でUrl.GenerateUrl()
ヘルパーメソッドを使用したいのですが、Url
はコントローラーに対するプロパティです。
これがどのように行われるかを確認するためにMVCソースを調べましたが、コントローラーの外部からRequestContext
にアクセスする必要があり、その方法がわかりません。
コントローラの外部からRequestContextにアクセスするにはどうすればよいですか?それでも問題が解決しない場合は、セットアップで問題を解決するにはどうすればよいですか?
ただし、IAccountServiceの実装内でUrl.GenerateUrlヘルパーメソッドを使用したい
この情報をパラメータとして渡すだけです。例:
public ActionResult Index()
{
var someUrl = Url.Action("about");
_accountService.Foo(someUrl);
}
これで、サービスクラス内にUrlHelperは必要なくなりました。 MVCインフラストラクチャとの対話が必要なものはすべて、サービスクラスに配置しないでください。それらは、要求、応答、セッションなどに依存するべきではありません...これらのオブジェクトを操作し、サービスクラスと一緒に接着するのはコントローラーの責任です。
現時点ではテストできないため、これは正しくない可能性がありますが、.NET4以降では次のようなことができると思います。
using System.Web;
using System.Web.Mvc;
// ...
var helper = new UrlHelper(HttpContext.Current.Request.RequestContext);
string url = helper.GenerateUrl(/* ... */);
mightは、コンテキストを HttpContext.Current
から直接取得するよりも、コントローラーからIAccountService
実装に渡す方が理にかなっています。 。