2009-07-04 6 views
3

だから私は電子メールを生成するビジネスオブジェクト/マネージャーを持っています。管理レイヤーのMVCルートからURLを生成...

これらの電子メールは、ウェブサイト上のさまざまなコンテンツへのリンクが含まれている...ので、MVCのルーティングについて理解する必要があります。..またはウェブサイトのURLを生成するには、少なくともどのようになります...

しかし私のビジネスオブジェクトがしますRequestContextなどへのアクセス権がなく、電子メールの生成は必ずしもWebサイトへのWebリクエストの結果ではありません(私は電子メールを生成するバックグラウンドスレッドで動作するディスパッチャを持っています)

要求にアクセスすることなく自分のURLを生成し、URLHelperを使用できなくなります。

思考?

答えて

1

私はスキーマを定義し、ルーティングとビジネスロジックの両方にそれを認識させることを好みます。同じURLスキーマの異なる実装を意味します。

理由をいくつかの理由:あなたのルーティングメカニズムが変更される可能性が

  1. 。たとえば、機能では、url_rewriteモジュールに切り替えることができます。
  2. 負荷分散インストールで考えられる問題。
  3. URLHelperを文書化されていない方法で使用しようとする必要はありません。

ところで、あなたは簡単にURLHelperのHttpRequestを置き換えることができます。これをユニットテストに使用しました。詳細については、HttpContextBaseの単体テストを検索するか、MvcContribのソースコードの例を参照してください。これは、ホストされていない環境でURLヘルパーと関連するすべてのものをインスタンス化するのに役立ちます。しかし、私はまだこれが良い考えだとは思わない。

+0

インターフェイス内で実装をラップする限り、これは問題ではありませんか?たとえば、IRouteHelper? "スキーマを定義し、それをルーティングとビジネスロジックの両方に認識させる方が好き"ということをどういう意味なのかわからない - スキーマ主導型の開発を使ってルーティングを定義するにはどうすればよいですか? – iasksillyquestions

+0

私はHttpRequestを模倣することを提案していますか? – iasksillyquestions

+0

これはあなたのために働く場合私はIRouteHelperで何か問題は表示されません。他の実装方法を提案することは、同じ質問(私が好むもの)に直面した場合に私が選択するものです。スキーマとは、URLスキーマ(例えば、製品がInvetory/Product/11654にあるという仕様で定義されています)を意味します。 Mockingは実行されたかどうかを検査するテストダブルです。もちろん私はこれを示唆していません。私が示唆しているのは、UrlHelperの依存関係を実装することです。実際には、RouteCollectionのラッパーだけでUrlHelperは必要ありません。 –

3

コントローラ外のUrlHelperを取得するには、そのデータとルーティングデータをHttpContextにフィードする必要があります。ここでは例です:

ASP.NET MVC5で
using System.Web; 
using System.Web.Mvc; 
using System.Web.Routing;  

HttpContextBase context = new HttpContextWrapper(HttpContext.Current); 
UrlHelper helper = = new UrlHelper(new RequestContext(context, RouteTable.Routes.GetRouteData(context))); 
0

(そしておそらくMVC4 - それが導入されたとき、私はよく分からない)、あなたはHttpRequest.RequestContextを使用して、より直接的にこれを行うことができます。例:

var urlHelper = new UrlHelper(HttpContext.Current.Request.RequestContext); 
関連する問題