ジェネリックスとCastleWCF機能を使用して、大きなプロジェクトのWCFCRUD部分のコードの記述を最小限に抑えようとしました。
WCFサービス契約を結んでいます:
[ServiceContract]
public interface IResourceService : ICRUDService<DTOResource>
{
[OperationContract]
DTOResource Get(long id);
}
とgenericインターフェース
public interface ICRUDService<T> where T is IDTO
{
T Get(long id);
}
また、汎用MVCコントローラー(dtosおよびサービスのすべての基本的なクラッドに1つのコントローラー)
public class CRUDController<T> : Controller where T is IDTO
{
readonly ICRUDService<T> service;
public CRUDController(ICRUDService<T> service)
{
this.service = service;
}
}
クライアント側で、WCFクライアントをWindsorコンテナに登録します
Component
.For<IResourceService , ICRUDService<DTOResource>>()
.AsWcfClient(... standard stuff... )
Everythigは正常に動作しており、コンポーネントとサービスが登録され、コントローラーが適切に作成され、サービスが提供されています
readonly ICRUDService<T> service;
コントローラのタイプは
Castle.Proxies.IResourceService
しかし、コントローラーでサービスを使用しようとすると、エラーが発生します
Method Get is not supported on this proxy, this can happen if the method is
not marked with OperationContractAttribute or if the interface type is not
marked with ServiceContractAttribute.
コントローラにいるとき、私はキャストをハードコードします
((IResourceService)service).Get(id);
すべてが正常に実行されているので、この問題は解決できると思います。
私もForwardを使おうとしました(同じ結果になります):
Component
.For<IActionTypeService>
.Forward<ICRUDService<DTOResource>>().AsWcfClient(...
それを機能させる方法は?