城堡动态代理不为继承的接口方法创建实现
本文关键字:接口 方法 创建 实现 继承 动态 代理 城堡 | 更新日期: 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
存在。 我可以_base
投IUseful
并成功呼叫GetMyObjects
;我只是不能打电话给GetShorts
. 看起来城堡没有实施IBase
. 我做错了什么吗?
这似乎有效,所以除非有人提供更好的解决方案,否则请继续使用它:
我删除了IBase
的继承,直接将其与ServiceInvoker<IBase>
一起使用. 服务现在必须直接实现IBase
并为其公开终结点,但它可以工作。