ServiceStackの例では、最初に ASP.NET MVC Web サイトを作成し、次に ServiceStack サービスを作成した単一のアプリケーションは見当たりません。
ビューを介して製品をレンダリングする非常に単純な ASP.NET MVC Web アプリケーションを考えてみましょう。コントローラー、ビュー、モデル、ビューモデルを使用します。
Product
ドキュメント DB に永続化されるモデルがあるとします。MVC Razor View/PartialView からマップされて表示さProductViewModel
れるビューモデルがあるとします。Product
これは Web 側の話です。ここで、Windows 8 アプリケーションなどのさまざまなクライアントに製品を返すサービスを追加するとします。
要求/応答クラスは、既にあるものから完全に切り離すべきですか? ProductViewModel
サービスから返したいものがすべて含まれている可能性があります。
既にProduct
(モデル クラス) を持っているのでProduct
、API 名前空間に別のクラスを含めることはできません。
では、API 名前空間にスタンドアロンProductRequest
クラスとProductRequestResponse
(ProductViewModel を継承する) クラスを導入する必要がありますか?
そうProductRequestResponse : ProductViewModel
ですか?
私が言いたいのは、すでに Model クラスと ViewModel クラスがあり、SS サービスの Request クラスと Response クラスを構築するには、主に既存のクラスからすべてをコピーして、さらに 2 つのファイルを作成する必要があるということです。これは私には DRY に見えません。懸念事項の分離のガイドラインに従っているかもしれませんが、DRY も重要であり、実際にはすべてを分離するだけではありません (すべてを分離するとコードの重複につながります)。
私が見たいのは、Web アプリケーションが既に作成されており、現在モデルとビューモデルを備えており、Web 上で表示するための適切なビューを返しますが、プログラム クライアントをサポートするために完全に機能するサービスに拡張できる場合です。AJAX クライアントなどのように...既に持っているものを使用します。
別物:
Movie
Request クラスとMovies
Request クラス (1 つは単一のムービー リクエスト用、もう 1 つはムービーのリスト用)があることがわかります。そのため、2 つのサービスもMovieService
ありMoviesService
、1 つは単一の映画のリクエストを処理し、もう 1 つは映画のジャンルを処理します。
さて、私はサービスに対する SS のアプローチが好きで、それが正しいと思いますが、単に要求の種類という理由だけでこの種の分離は好きではありません。監督別の映画が必要な場合はどうすればよいですか? Director
プロパティとそのためのさらに別のサービス ( ) を持つさらに別の要求クラスを発明MoviesByDirector
するでしょうか?
サンプルは 1 つのサービスに向けられるべきだと思います。映画に関係するものはすべて 1 つの屋根の下にある必要があります。ServiceStackでそれをどのように達成しますか?
public class ProductsService : Service
{
private readonly IDocumentSession _session;
private readonly ProductsHelperService _productsHelperService;
private readonly ProductCategorizationHelperService _productCategorization;
public class ProductRequest : IReturn<ProductRequestResponse>
{
public int Id { get; set; }
}
// Does this make sense?
// Please note, we use ProductViewModel in our Views and it holds everything we'd want in service response also
public class ProductRequestResponse : ProductViewModel
{
}
public ProductRequestResponse GetProducts(ProductRequest request)
{
ProductRequestResponse response = null;
if (request.Id >= 0)
{
var product = _session.Load<Product>(request.Id);
response.InjectFrom(product);
}
return response;
}
}