0

他のいくつかのインターフェースに継承される基本インターフェースがあります。このインターフェイスには 1 つのメソッドがあります。

[ServiceContract]
public interface IBase
{
    [OperationContract]
    List<short> GetShorts();
}

もちろん、私は継承インターフェースを持っています:

[ServiceContract]
public interface IUseful : IBase
{
    [OperationContract]
    List<MyObject> GetMyObjects(MyInput input);
}

追加のセットアップなしでサービスを呼び出す簡単な方法を提供するために、インターフェイスの汎用インターセプターとして機能するクラスがあります。

public class ServiceInvoker<T> : DynamicObject, IInterceptor
    where T : class
{
    // ...
    public T Client { get { return (dynamic)this; } }
    // ...
}

を実装する任意のサービスを呼び出せるようにしたいIBaseので、次のようなクラスがあります。

public class BaseCaller
{
    private readonly IBase _base;
    public BaseCaller(IBase base) { _base = base; }
    public List<short> GetShorts() { return _base.GetShorts(); }
}

BaseCaller私は基本的に次のように構築します:

var si = new ServiceInvoker<IUseful>();
var bc = new BaseCaller(si.Client);

問題は、私が電話をかけGetShorts、それが呼び出すときに発生します_base.GetShorts:

MissingMethodException

メソッド 'MyApp.IUseful.GetSubNumbers' が見つかりません。

にカーソルを合わせると_base、インターセプターが表示され、それが存在することがわかりtoken_GetSubNumbersます。キャスト_baseして正常IUsefulに呼び出すことができます。GetMyObjects私はちょうど呼び出すことができませんGetShorts。Castle は を実装していないようIBaseです。私は何か間違ったことをしていますか?

4

1 に答える 1

0

これは機能しているように見えるので、誰かがより良い解決策を提供しない限り、それを使用してください:

の継承を削除し、IBaseで直接使用するだけServiceInvoker<IBase>です。サービスは直接実装IBaseしてエンドポイントを公開する必要がありますが、機能します。

于 2013-10-24T19:43:19.410 に答える