そこで、いくつかの懸念から、当初は単一のインターフェース契約であったものを2つの別個の契約に分割しました。現在、両方のインターフェイスを実装するクラス(部分的)は1つだけであり、それらすべてをWCFを介してRESTサービスとして利用できるようにしたいと考えています。契約内容は以下のとおりです。
WCFサービスホストにAutofacを使用しています。
以下は私の.svcファイルコードです
WCFサービスの場合:Factory="Autofac.Integration.Wcf.AutofacServiceHostFactory, Autofac.Integration.Wcf"
RESTfulサービスの場合:Factory="Autofac.Integration.Wcf.AutofacWebServiceHostFactory, Autofac.Integration.Wcf"
WCFの例:
wcfサービスの場合
public interface IEmployeeCommandService {}
public interface IEmployeeQueryService {}
public partial class EmployeeService : IEmployeeCommandService {}
public partial class EmployeeService : IEmployeeQueryService {}
public partial class EmployeeService {}
そして私のWeb.configファイルは以下のようになります
<service behaviorConfiguration="ServiceBehavior" name="Application.EmployeeService">
<endpoint address="" binding="basicHttpBinding" contract="Application.IEmployeeCommandService" />
<endpoint address="" binding="basicHttpBinding" contract="Application.IEmployeeQueryService" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
そして私のEmployeeService.svcコードは次のようになります
<%@ ServiceHost Service="Application.EmployeeService, Application"
Factory="Autofac.Integration.Wcf.AutofacServiceHostFactory, Autofac.Integration.Wcf"%>
このアプローチでは、プレーンなWCFサービスが正常に機能しています。EmployeeService.svcを参照すると、コマンドとクエリサービスの両方の操作が表示されます。
似たようなアプローチ私は以下のようにRESTFulサービスを試みています。しかし、RESTFulサービスを参照するとエラーが発生します。
RESTFulの例:
public interface IEmployeeRESTfulQueryService {}
public interface IEmployeeRESTfulCommandService {}
public partial class EmployeeRESTfulService {}
public partial class EmployeeRESTfulService : IEmployeeRESTfulCommandService {}
public partial class EmployeeRESTfulService : IEmployeeRESTfulQueryService {}
そして私のweb.confingは以下のようになります
<service behaviorConfiguration="ServiceBehavior" name="Application.EmployeeRESTfulService">
<endpoint name="Command" address="Command" behaviorConfiguration="webHttp" binding="webHttpBinding" contract="Application.IEmployeeRESTfulCommandService" />
<endpoint name="Query" address="Query" behaviorConfiguration="webHttp" binding="webHttpBinding" contract="Application.IEmployeeRESTfulQueryService" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
<behavior name="webHttp">
<webHttp helpEnabled="true" automaticFormatSelectionEnabled ="true" />
</behavior>
.svc(RESTFul)を参照すると、以下のエラーが発生します。
エラー:
サービス'EmployeeRESTfulService'は複数のServiceContractタイプを実装し、構成ファイルにエンドポイントは定義されていません。WebServiceHostはデフォルトのエンドポイントを設定できますが、サービスが単一のServiceContractのみを実装している場合に限ります。単一のServiceContractのみを実装するようにサービスを変更するか、構成ファイルでサービスのエンドポイントを明示的に定義します。