C#:将一个接口继承到另一个充当wcf接口的接口

时间:2012-07-27 09:46:52

标签: c# inheritance interface method-hiding

我已经提出了一些与此相关的问题,但仍然没有确定的答案,所以这是一个更简单的问题。

考虑一下。我有2个接口。一个人描述了道。一个是wcf接口。 wcf接口继承dao接口,以便使用wcf属性公开其方法。因为它是一个wcf接口,我当然必须再次声明这些方法,以便在它们上面放置wcf属性,例如[OperationContract]。因此,我实际上隐藏了以前的接口方法,并且必须放置' new'他们的关键字。在这种情况下这是正确的做法。我需要能够通过wcf接口呈现dao接口方法,因此继承它的原因。我想强制wcf接口暴露这些功能。看起来我的双手很紧张,我必须使用这种方法来暴露这些方法,但你觉得怎么样?

在代码中,它看起来像这样:

//The dao interface
public interface IMyDao
{
    void Foo();
}

//The wcf interface which implements/extends the IMyDao interface in order to add wcf attributes
[ServiceContract]
public interface IMyWCF : IMyDao
{
    [OperationContract]
    new void Foo();
}

//The dao class that implements the dao interface
public class MyDao : IMyDao
{
    public void Foo()
    {
        //Do something
    }
}

//The class implements the wcf interface. Makes calls to the dao.
public class MyWCF : IMyWCF
{
    public void Foo()
    {
        MyDao myDao = new MyDao();

        myDao.Foo();  
    }
}

1 个答案:

答案 0 :(得分:3)

使用2个接口 - 不要为DAO和WCF合同共享一个接口

包含一个通过WCF服务调用DAO的包装器。

例如,如果您的DAO具有以下方法:

public interface IMyDAO
{
    MyObject GetMyObjectById(int Id);
}

您的操作合同具有相同的签名:

public interface IMyWCFContract 
{
    [OperationContract]
    MyObject GetMyObjectById(int Id);
}

然后你会有一个包装类:

public class MyWCFService : IMyWCFContract
{
     private MyDAO dao;

     public MyWCFService()
     {
        dao = new MyDAO(); 
     }

     public MyObject GetMyObjectById(int id)
     {
        return dao.GetMyObjectById(id);
     }
}

替代方案可能是考虑使用RESTFUL服务。