城堡动态代理不为继承的接口方法创建实现

本文关键字:接口 方法 创建 实现 继承 动态 代理 城堡 | 更新日期: 2023-09-27 18:36:41

我有一个基本接口,它被其他几个接口继承。 此接口有一种方法:

[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

Missing MethodException

找不到方法 'MyApp.IUseful.GetSubNumbers'。

当我将鼠标悬停在_base上时,我可以看到拦截器,我可以看到token_GetSubNumbers存在。 我可以_baseIUseful并成功呼叫GetMyObjects;我只是不能打电话给GetShorts. 看起来城堡没有实施IBase. 我做错了什么吗?

城堡动态代理不为继承的接口方法创建实现

这似乎有效,所以除非有人提供更好的解决方案,否则请继续使用它:

我删除了IBase的继承,直接将其与ServiceInvoker<IBase>一起使用. 服务现在必须直接实现IBase并为其公开终结点,但它可以工作。

相关文章: