我有一个基本接口,由其他几个接口继承。该界面有一种方法:
[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
。我做错了吗?
答案 0 :(得分:0)
这似乎有效,所以除非有人提供更好的解决方案,否则请继续使用它:
我删除了IBase
的继承权,只是直接使用ServiceInvoker<IBase>
。现在,服务必须直接实现IBase
并为其公开端点,但它可以正常工作。