2011-07-04 17 views
1

背景: 私はデータベースを持つASP.NET MVC3アプリケーションを持っています。私はまた、(他のものの中で)Webアプリケーションのデータベースを初期化する複雑なコンソールアプリケーションを持っています:生成、制約の追加、sprocsの追加、トリガー、シードの追加など。我々のアーキテクチャではセンス)。ホスティング環境外からのASP.NET MVCパスへのアクセス

問題: コンソールアプリは明らかにそうなどHostingEnvironmentMapPathHttpContext.CurrentServer.MapPath~、へのアクセス権を持っている。しかし、私はからWebアプリケーションのパスへのアクセスを必要としない、ホスト環境で実行されていませんコンソールアプリ。また、コンソールアプリケーションはWebアプリケーションを呼び出し、通常はこれらのクラスを使用しますが、これらはすべてnullまたは未定義です。

質問: 私はホスティング環境のパスメカニズムにアクセスできるように、これらのクラスの1を偽装するためにいくつかの方法は、それが動作していないにもかかわらず、ありますか?

私はコンソールアプリケーションに必要なすべてのパスをハードコードできますが、それは非常に望ましくありません。

ユニットテストにも同じ必要性が要求されるため、これが可能でなければならないという印象を受けました。

TIA

+0

「コンソールアプリケーションからウェブアプリのパスにアクセスする必要があります」 - これはどういう意味ですか?どちらのパス、なぜですか? – bzlm

+0

@bzlm:Webアプリケーションのルートパス(〜)、そのイメージディレクトリ、dbディレクトリ(複数)、一時ディレクトリ、さまざまなcsvリポジトリ、クライアントファイルなど...コンソールアプリケーションはさまざまなバックエンドシステムからデータを取得し、 Webシステムが見つかる正しい場所に置いてください。これをきちんと行うためには、Webアプリケーションで使用するパスにアクセスする必要があります。それ以外の場合はすべてハードコードしなければなりません。また、いくつのサブシステムが呼び出されると、問題につながります。 – Matt0

答えて

0

部品番号は、あなたが必要とMVC3コンテキストをあざけるための素晴らしいです。設定が非常に簡単で、通常はWebコンテキストで実行されるメソッドやプロパティをオーバーライドして、必要なオブジェクトを返すことができます。

むしろさらに説明しようとするよりも、ここで起動します。

How do I mock the HttpContext in ASP.NET MVC using Moq?

MVC 3 Unit Test - Get Actual Response Data

http://www.sharpedgesoftware.com/Blog/2011/03/14/mocking-a-controllercontext-with-authenticated-user-with-moq-for-aspnet-mvc-3

http://code.google.com/p/moq/

+0

この資料の一部を読んで、おそらくうまくいくかもしれませんが、このような単純な作業では面倒に複雑に思えます...そして、他には使用しない依存関係を紹介します。 – Matt0

+0

@ Matt0、これを解決するために嘲笑を使用して真剣に酔っているアーキテクチャのように感じる。コンソールアプリケーションが利用できないものに依存している場合、実際にコードを実行させることを除いて、そのことを嘲笑することは無意味です。 – bzlm

+0

@bzlm:合意私はそれがどのように助けになるかわかりません – Matt0

1

小規模なWebサービスを作成してから目的のデータを公開Webアプリケーションを起動し、コンソールから呼び出しますeアプリ

+0

おそらく、しかし、Webアプリケーションが実行されている必要があります - 私はそれだけでアセンブリを参照することはできません。 – Matt0

+0

@ Matt0 - HttpContext.Currentのような項目の場合、Webアプリケーションを実行する必要はありませんか?アセンブリから現在のHttpContextを取得することはできません。ランタイム値です。 – JeremyDWill

+0

@JeremyDWill True、それで私はそれにアクセスする必要はありません。私が望むのはパスメカニズムだけです.HttpContextだけでなく、複数のクラスからそれらを得ることができます。しかし、それが起こると、それらのクラスはすべて利用できなくなります。 – Matt0

0

StructureMap(または他のIoCフレームワーク)を試してみてください。 現在作業中のプロジェクトでは、HttpContextBaseをウェブサイトのHttpContext.Currentオブジェクトに配線しています。 この方法では、どの環境でもHttpContext機能を使用できます。

私たちのユニットテストでは、HttpContextBaseから上書きするいくつかのスタブ/モックオブジェクトを使用しています。使用したいオブジェクトのほとんどは、配線を設定するために使用できるインターフェースまたは基本クラスを持っています。 .NET Frameworkを模擬するには、Pex & Molesを試してみてください。そのようにすることができるはずです、または私は言われました。それを自分で使ったことはありませんが、きれいに見えます!

0

これらのうちいくつかが浮かんでいます。ほとんどの場合、実際には1または2の設定値が必要です。パスをかなり効果的に計算できます。値#1はWebアプリケーションのルートです。そこから任意のリソースへのURLを簡単に構築できます。値#2は、実際にこのコンテキストで重要な場合は、Webアプリケーションの物理的な場所です。

代わりにウェブアプリの周りの様々なパスを散乱させる、我々はすべての主要なリソースのprivate static readonly文字列を含む単一の静的Pathsクラスを、持っている:(私は本当にそれ好きではないが)、私がやった何

1

システム内のパス(T4MVCが私たちを助けないパス)。何かへの道が必要な時はいつでも、私はそのクラスに頼みます。そして、必要な文字列をPath.Combine()などの文字列内で実行します。その結果、すべてのハードコードされた文字列は、

だから私は(パブリック、および読み取り専用の欠如に注意してください)、そのクラスにプロパティpublic static string ApplicationRootPath { get; }を追加し、あなたのユースケースに応じて、ApplicationRootPath = HostingEnvironment.MapPath("~");または"/"にそれを初期化する静的コンストラクタ。

次に、コンソールアプリケーションから、その「ルート」ディレクトリをPaths.ApplicationRootPath = "some absolute or relative path here";で上書きできます。その1行の後、私はWebアプリケーション内のすべてのパスにアクセスすることができます。

実際にはきれいですが、それでも理想的ではありません。誰かが良いアイデアを持っていない限り、私はこれを答えとして受け入れます。

関連する問題