web-dev-qa-db-ja.com

REST API + Webページの使用に関するASP.NET MVCとWCF

プログラムによるサービス指向の使用と人間の相互作用の議論は明確だと思います。

しかし、プログラム的なAPIと、同じAPIで接続されたデータを利用するWebサイトの両方を利用するアプリケーションを作成する場合、ASP.NETのみを使用することに賛成ですか?

ASP.NETとWCFを統合して同じアプリケーションで作業するのはどれほど簡単ですか。

14
Xster

ASP.NET/MVCとWCFの両方を活用する1つのアプリケーションを作成する限り、それは素晴らしいことではありません。 WebAPIは問題を改善したかもしれませんが、同じアプリでWCFとMVCを使用していた私がよく知っている1つのプロジェクトでは、同じ概念を表すために2つの異なるモデルセットを維持することになりました-1つはWCFコード用、もう1つはMVC用コード。 2つのモデル間で物事を変換するために作成しなければならなかったすべてのマッパーを想像できます-回避することができる/すべきであったコード行がたくさんありました。

これが発生した理由の1つは、WVC要求および応答オブジェクトに[DataContract]とそれらのプロパティに[DataMember]で注釈を付ける必要があることですが、MVCではこれを必要としません。一方、慣用的なMVCでは、WCF DataContractsとは異なる目標を持つViewModelが必要になります。もちろん、ドメインオブジェクトの2つの完全なセットの使用は、WCFとMVCの競合よりも Conwayの法則 との関連性が高かった可能性がありますが、WCFとMVCには異なる目的と要件があることを指摘する価値があります。出力および入力まで。

個人的には、特に複数のクライアントが必要な場合は、シンプルだが強力なサービス指向のバックエンドAPIを開発することに一部は欠けています。 BackboneJSKnockoutJS などを使用してアプリケーションコードを記述できるため、優れたJavaScript MVVMおよびマイクロMVCフレームワークの出現により、これは自然な選択になると思います。その後、選択したマイクロMVCでバックエンドを使用して、ウェブアプリを作成したり、モバイルクライアントで使用したりできます。パートナーも同じAPIをリモートで使用できます。

提案

WebAPIまたは Service Stack のいずれかが、バックエンドAPIを構築するための良い候補になる可能性があります。 Service Stackをお勧めします。過去数か月間使用しており、WCFの優れた代替品であることがわかりました。現在、サービススタックのチュートリアルシリーズを作成しています blog

サービススタックを維持するグループが サンプルアプリケーション を投稿しました。フレームワークを使用して、クローンのようなStackOverflowを開発しました。これは、特に説得力があると思われる開発パターンを示しています。これには、MVC Webサイト、モバイルアプリ、または他のほぼすべてが簡単に利用できると想像できる、単純なモデルベースのサービスバックエンドが含まれます。 ServiceStackの設計目標は、クライアントとサーバー間の結合を減らすパターンを明確に奨励しています。より少ないメソッドを優先して、GetCustomersInRegionWithSearchTerm(int regionId, string searchTerm)のような呼び出しでおしゃべりなAPIを回避するという考え方です。次のように、サービススタックに同じものを実装できます。

_[Route("/customers", "GET"]
[Route("/customers/search/{SearchTerm}", "GET"]
[Route("/customers/region/{Region}", "GET"]
[Route("/customers/region/{Region}/search/{SearchTerm}", "GET"]
public class Customers 
{
    public int? RegionId { get; set; }
    public string SearchTerm { get; set; }
}

public class CustomersService : Service
{
    public object Get(Customers request) {
        // handle request
        return new CustomersResponse();
    }
}
_

私の目には、ビジネスロジックが多数の個別のメソッドに分散する代わりに、GetCustomersInRegionWithSearchTerm(int regionId, string searchTerm)GetCustomersInRegion(int regionId)GetCustomersWithSearchTerm(string searchTerm)GetCustomers()、それはすべて1つの場所にあります。これは、より保守しやすいコードにつながるはずです。

偶然にも、Stack Exchangeは元のサービススタック author を採用しました。彼は引き続きサービススタックプロジェクトに 積極的にコミット します。

私は特に、特定のものに対するメッセージキューが好きです。WCFではこれが許可されていますが、WebAPIではできません。 ServiceStackでは、同じWebサービスをMQ経由で呼び出すことができます。この詳細については、github.com/ServiceStack/ServiceStack/wiki/Messaging-and-redisのRedis MQホストを参照してください。

11
Kyle Hodgson

@ tzerb はIMOに正しく答えましたが、その答えを拡張したいと思いました。 ASP.NET Web APIは現在ベータ段階であり、OSSプロジェクトが最も近いフレームワークです。

製品の簡単な説明は次のとおりです( ASP.NET Web API ページから引用):

ASP.NET Web APIは、ブラウザーやモバイルデバイスを含む幅広いクライアントに到達するHTTPサービスを簡単に構築できるようにするフレームワークです。 ASP.NET Web APIは、.NET FrameworkでRESTfulアプリケーションを構築するための理想的なプラットフォームです。

Web APIを利用するために使用する可能性があるクライアントアプリケーションについては、ASP.NETアプリケーションである必要はありません。 JavaScriptを使用して、静的HTMLページでAPIを利用できます。 jQueryなどの便利なJavaScriptライブラリを使用すると、これを簡単に行うことができます。

一方、サーバーサイトのASP.NETアプリケーションでは、APIを確実に使用できます。 Web APIプロジェクトでは、Httpサービスと呼ばれる新しいHTTP .NETクライアントAPIも導入しました。これにより、HTTPサービスを簡単に利用できます。

一般的に、開始するための適切なリソースのセットは次のとおりです。

ASP.NET Web API入門-チュートリアル、ビデオ、サンプル

プロジェクトはまだベータ段階であることを忘れないでください。私はあなたがフォローすることをお勧めします Henrik F Nielsen ブログでは、プロジェクトの未リリースの最新アップデートに関する情報を投稿しています。プロジェクトのソースコードと内部の開発フロー ASP.NET Web Stackプロジェクト にアクセスできます。

4
tugberk

現在の指針は、WCF for RESTではなくMVC Web APIを使用することだと思います。 http://stephenwalther.com/blog/archive/2012/03/05/introduction-to-the-asp-net-web-api.aspx

開発モデルはかなり接近していて、WCFの厄介な構成をバイパスします。

3
tzerb