ServiceStackのサービスコントラクト定義について少し混乱しています。
ここで述べたようにhttps://github.com/ServiceStack/ServiceStack/wiki/SilverlightServiceClient
ポータブルクラスライブラリまたはリンクされたプロジェクトを使用することが可能です。(OK、PCLには、[RestService]
属性または一般に外部参照をサポートしないという制限があります。)
RouteAttribute
実際には、の代わりに常に使用されるようになりましたRestServiceAttribue
。
新しいAPIがあります: https ://github.com/ServiceStack/ServiceStack/wiki/New-Api
したがって、、およびクラスの代わりにMyCall
、次のようにジェネリックまたは型を直接使用することが可能です。MyCallResponse
MyCallService
[Route("/reqstars")]
public class AllReqstars : IReturn<List<Reqstar>> { }
public class ReqstarsService : Service
{
public List<Reqstar> Get(AllReqstars request)
{
return Db.Select<Reqstar>();
}
}
ここで、バニラプロジェクトについて考えてみましょう。
DTOと「モデル」を定義して共有する場所が欲しいです。それらを一度定義し、検証属性などでタグ付けして、Silverlightプロジェクトや、データアクセス用の流暢なnhibernateアセンブリで再利用したいと思います。それが私が契約集会と呼んでいるものです。これは、各テクノロジスタックのPCLまたはリンクされたプロジェクト(私の場合はSilverlightおよび.NET 4(サーバー側))にすることができます。私は毎日サービスクライアントを生成したくないので、チャネルファクトリアプローチ/サービススタッククライアントの方法を実行したいのです。
DAL(これは私の質問の一部ではありません)を持っていることに加えて、私はサービスロジック自体のために別のアセンブリを持ちたいです。契約とビジネスロジックの厳密な分離。私が最初に気付いたのは
Service
、アセンブリスパムを取得せずに、サービス実装を(ServiceStackのもの)から継承するための一致するnugetパッケージを見つけることができなかったことです。ついに、私は使用することにしました:PM> Install-PackageServiceStack.Host.AspNet...。
'Microsoft.Web.Infrastructure1.0.0.0'をHR.RoBP.Servicesに正常に追加しました。
'WebActivator1.5.3'をHR.RoBP.Servicesに正常に追加しました。
'ServiceStack.Redis3.9.35'をHR.RoBP.Servicesに正常に追加しました。
'ServiceStack.OrmLite.SqlServer3.9.35'をHR.RoBP.Servicesに正常に追加しました。
'ServiceStack3.9.35'をHR.RoBP.Servicesに正常に追加しました。
'ServiceStack.Host.AspNet3.9.33'をHR.RoBP.Servicesに正常に追加しました。
プロジェクトに追加されたファイル(App_Start、jquery ...など)も削除しました。
サービスプロジェクトは、ホストプロジェクトによって参照およびホストされます。
ルーティングはどこで行う必要がありますか? 今、私はコントラクトで、またはホストアセンブリで手動でそれを行う必要があります。私は、サービスがどのようにアクセス/ルーティングされるべきかを言うべきだと思います。
要求/応答パターンクラスをサービスアセンブリに移動する必要がありますか?
私のアプローチは完全に間違っていますか?
WCFを使用する前。コントラクトアセンブリにモデル、要求/応答、およびIService定義があり、サービスアセンブリにIServiceが実装されています。ホストは.svcファイルを必要とし、それは機能していました。また、通信フレームワークなしで、サービスを直接呼び出すことで(たとえば、wcfエンドポイントをインスタンス化せずにコマンドラインアプリから)使用することができました。
var result = new MyCallService().Execute(new MyCall() { MyParamater="Value"})
対。
var result = new MyCallService().MyCall("Value");
IMyCallServiceの昔ながらの方法を紹介し、それを実装し、iocのものを使用してMyCallService(ServiceStack)Execute()メソッド内で呼び出す必要があります...
public class MyCallSevice : Service
{
// use DI
[Import]
public IMyCallService ServiceInstance { private get; set; }
public MyCallResponse Execute(MyCall request)
{
return new MyCallResponse(ServiceInstance.MyCall(request.MyParameter));
}
}
// or use the Request Response directly in the Service? so that it looks like this:
public class MyCallSevice : Service
{
// use DI
[Import]
public IMyCallService ServiceInstance { private get; set; }
public MyCallResponse Execute(MyCall request)
{
return ServiceInstance.MyCall(request);
}
}
私の目標は、実行時のアプリケーションの速度とコーディング速度の向上です。新しいメソッドを追加するときに、多くの場所や手順に触れる必要はありません。
私がすべきベストプラクティスは何ですか? ヒントや経験データは大歓迎です!
どうもありがとうございます!