23

私は MVC Web サイトを作成しています。また、Web サイト内とサード パーティの両方で使用するための Web API を作成する予定です。

MVC コントローラーから、ビジネス ロジックを含むサービス レイヤーを呼び出し、ドメイン モデルに基づいて動作し、検証を実行し、インフラストラクチャの外部サービス呼び出しを行います。サービス レイヤーは、データベースとのやり取りのためにリポジトリを呼び出します。

今、私はServiceStackの外観が好きで、Web API に使用するつもりです。ASP.NET MVC 4 Web APIよりも成熟しているようです。私の質問は、MVC コントローラーと同様に、ServiceStack API を上記のサービス レイヤーに呼び出す必要がありますか?それとも、Web クライアントと MVC コントローラーの両方にサービスを提供するサービス レイヤーにする必要がありますか?

4

1 に答える 1

37

私はどちらもしません。

理想的には、MVC と ServiceStack の両方が純粋な C# 依存関係を使用および共有する必要があります。MVC + ServiceStack Web サイトが調和して共存している好例は、SocialBootstrapApiデモ プロジェクトにあります。これは、AppHarbor ( http://bootstrapapi.apphb.com ) にデプロイされています。

すべての依存関係を ServiceStack AppHost に登録してから、MVC コントローラー ファクトリを登録して、MVC コントローラーと ServiceStack サービスの両方がこれらの依存関係で自動配線されるようにします。

AppHost で:

void Configure(Funq.Container container) {
    container.Register<IGreeter>(c => new Greeter());
    //Set MVC to use the same Funq IOC as ServiceStack
    ControllerBuilder.Current.SetControllerFactory(
       new FunqControllerFactory(container));
}

ServiceStack サービスの使用例IGreeter

public class HelloService : Service {
    public IGreeter Greeter { get; set; } //Autowired

    public HelloResponse Get(Hello request) {
        return new HelloResponse { 
           Result = Greeter.SayHelloTo(request.Name) };
    }
}

同じ IGreeter を使用した MVC コントローラーの例:

public HelloController : ServiceStackController {
    public IGreeter Greeter { get; set; } //Autowired

    public void Index(string name) {
       ViewBag.GreetResult = Greeter.SayHelloTo(name);
       return View();
    }        
}

一般的な考え方は、MVC コントローラー内のロジックであり、ServiceStack サービスは HTTP レイヤー/統合ポイントに関係している必要があります。 MVCコントローラーの場合はViewModelにデータを入力しますが、ServiceStackではResponse DTOにデータを入力します。

MVC コントローラーから ServiceStack サービスを呼び出す

上記の C# グリーティング サービスを介して Controllers + ServiceStack 共有機能を持たせますが、次のように MVC Controller から ServiceStack サービスを呼び出すこともできます。

public HelloController : ServiceStackController {

  public void Index(string name) 
  {
    using (var helloService = AppHostBase.ResolveService<HelloService>())
    {
       ViewBag.GreetResult = helloService.Get(name).Result;
       return View();
    }
  }        
}

ServiceStackController とのセッション/キャッシュの共有

MVC コントローラーの例はServiceStackControllerから継承されていますが、必須ではありませんが、MVC と ServiceStack で同じ Session / Caching / Authentication + RequiredRole/RequiredPermission 属性を共有できます。

ServiceStack が MVC にもたらすその他の利点については、 MVC PowerPackを参照してください。

于 2012-05-13T15:35:14.493 に答える