ジェネリックスと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(...
それを機能させる方法は?