コントローラーの外側のRequestContextにアクセスするにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/3722352

質問

バックグラウンド

私は、ビジネスロジックをコントローラーから独自のサービスに移行しようとしています。

コントローラ

public class AccountController : Controller
{
    private readonly IAccountService _accountService; 

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

    ....
}

依存関係を注入するためにUnityを使用しています。使いたいです Url.GenerateUrl() の実装内のヘルパーメソッド IAccountService しかし Url コントローラーに対するプロパティです。

MVCソースを見て、これがどのように行われるかを確認しましたが、アクセスする必要があります RequestContext コントローラーの外から、それを行う方法がわかりません。

質問

コントローラーの外部からRequestContextにアクセスするにはどうすればよいですか?それが私の問題を解決しない場合、セットアップを考慮して問題を解決するにはどうすればよいですか?

役に立ちましたか?

解決

ただし、iaccountServiceの実装内でurl.genereTurlヘルパーメソッドを使用したい

この情報をパラメーターとして渡すだけです。例:

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

これで、サービスクラス内でurlhelperを必要としなくなりました。 MVCインフラストラクチャと対話する必要があるものはすべて、サービスクラスに配置されるべきではありません。リクエスト、応答、セッションなどに依存すべきではありません...これらのオブジェクトと連携して、サービスクラスと一緒に接着するのはコントローラーの責任です。

他のヒント

現時点ではテストできないため、これはまったく正しくないかもしれませんが、.NET 4+でこのようなことができると思います。

using System.Web;
using System.Web.Mvc;

// ...

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

それ そうかもしれない コントローラーからあなたにコンテキストを渡すためにもっと理にかなっています IAccountService それを直接つかむのではなく、実装 HttpContext.Current.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top