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

时间:2013-10-24 16:34:38

标签: c# inheritance interface castle-dynamicproxy

我有一个基本接口,由其他几个接口继承。该界面有一种方法:

[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。我做错了吗?

1 个答案:

答案 0 :(得分:0)

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

我删除了IBase的继承权,只是直接使用ServiceInvoker<IBase>。现在,服务必须直接实现IBase并为其公开端点,但它可以正常工作。