2010-11-30 15 views
1

ASP .NET MVC2を使用してデータ駆動型Webサイトを作成しています。機能要求の一部は、再利用可能なWebサービスを作成して、エンドユーザーがマッシュアップを作成するために使用するデータおよびビジネスロジックの一部を公開することも目的としています。組織の内部と外部にはかなりの量のユーザーが参加しています。ASP .NET MVC2のWebサービス

これまでは、(エンティティフレームワークORMを使用して)データベースと通信し、データを(モデルビュービューモデルパターンを使用して)処理して表示するアプリケーションを構築しました。この部分はウェブサイトの部分では簡単です。

webservicesの部分については、WCFを使用してWebサービスを作成する方法を検討しています。別のプロジェクトとしてWCFデータサービスを作成する必要があります。コントローラのコードの一部を再利用できるはずです。

私はこれらのWebサービスを呼び出す必要がありますし、それらをモデルとして使用する必要がありますか?ベストプラクティス?

asp.netの初心者の方には、正しい方向への指針があれば幸いです。

+0

WCFサービスを作成する必要がある特別な理由はありますか?ビュー出力として 'JsonResult'を返すことによってWebサービスとしてMVCだけを使用することはできませんか? – KallDrexx

+0

@KallDrexx:柔軟性の欠如が理由です。 –

+0

@ KallDrexx、コントローラー内からSQLサーバーに直接アクセスできるときに 'JsonResult'を使うのはなぜですか?ここでの質問は、さまざまなクライアントによって消費される可能性のある再利用可能なサービスを公開することだと思います。 –

答えて

2

Webサービスのホスティングに別のWebアプリケーションを使用できます。これにより、IISの別々の仮想ディレクトリにMVCアプリケーションとWCFサービスをホストすることができます。あなたは、Webサービスを書いたら、クライアントプロキシを生成することができ、その後、クライアント・アプリケーションでは、リポジトリを使用できます。

public interface IProductsRepository 
{ 
    IEnumerable<Person> GetProducts(); 
} 

をして、あなたのWCFサービスからデータを取得します。このリポジトリの特定の実装を持っています:

public class ProductsRepositoryWcf 
{ 
    public IEnumerable<Person> GetProducts() 
    { 
     using (var client = new YourWebServiceClient()) 
     { 
      // call the web service method 
      return client.GetProducts(); 
     } 
    } 
} 

そして最後に、このようになりますあなたのコントローラのコンストラクタにこのリポジトリを注入:あなたが見ることができるように

public class HomeController: Controller 
{ 
    private readonly IProductsRepository _repository; 
    public HomeController(IProductsRepository repository) 
    { 
     _repository = repository; 
    } 

    public ActionResult Index() 
    { 
     var products = _repository.GetProducts(); 
     // TODO: An intermediary step might be necessary to convert the Product 
     // model coming from the web service to a view model which is adapted 
     // to the given view 
     return View(products); 
    } 
} 

コントローラはデータが取り込まれる方法によって完全に切り離されます。それが気にするのは、与えられた契約(IProductsRepositoryインターフェイス)を尊重することだけです。お気に入りのDIフレームワークを使用すると、実装を簡単に切り替えることができます。

あなたのコードが私のものと似ている場合、現在のMVCアプリケーションで変更する必要があるのは、モデルとデータアクセスレイヤーをサービス参照を追加する別のWCFサービスプロジェクトに外部化し、ProductsRepositoryWcfリポジトリを開き、DIフレームワークにProductsRepositorySqlの代わりにこの実装を使用するように指示します。ProductsRepositorySqlはWebサービスに移動します。

+0

ありがとうダーリン。 WCFサービスをホストするための別のアプリケーションをセットアップします。質問 - 私はdb側の上にいくつかのビジネスロジックを持つ単なる単純なクエリがあるので、普通の古いasmxを使う予定です。その後、WCFデータサービスを調べ始めました。スコープがasmxと一緒に行くともっと簡単になりますか?また、ProductsRepositoryWCFは私にパフォーマンスヒットを与えるだろうか(Webアプリケーション側で)。私は両方を維持し、Webアプリケーション用のProductsRepositorySQLを使用し続ける必要がありますか?私は保守性のための1つのコードベースとしてそれを保持したいと思います。再度、感謝します。 – user275157

関連する問題