服务合同实现另一个接口

时间:2011-02-05 07:51:13

标签: wcf interface

请告诉我这是否可行。 我有一个客户端win表单应用程序和一个C#中的wcf应用程序。这是我的模特。

共同项目

public interface IServiceA
{
     string DoWorkA();
}

我在Common项目中没有使用ServiceContract或OperationContract属性。

现在,ClientProject引用了Common Project。 ServiceProject还引用了Common Project。

在ServiceProject中,我使用的服务合同如下所示:

[ServiceContract]
public interface IGetData : IServiceA
{
   // Implements IServiceA method
   [OperationContract]
   string DoWorkA();
}


public class MyService : IGetData
{
    string DoWorkA()
     {

     }
}

在客户端

public class MyClass : IServiceA
{
    // Implements the IServiceA method
    string DoWorkA()
     {
        // Inside this I will call the MyService using DuplexChannel proxy
     }
}

[请假设此模型中实施了回调合约]

为什么我问这个问题是,在我的应用程序中,我有很多模块,每个模块都需要使用自己的方法从服务中获取数据。所以我打算使用类似外观的模式。请告诉我这是否正确????

2 个答案:

答案 0 :(得分:2)

您编写的代码会生成警告,因为IGetData DoWork()方法会隐藏IServiceA DoWork方法。

要摆脱警告,您需要添加新关键字:

[ServiceContract]
public interface IGetData : IServiceA
{
   // Implements IServiceA method
   [OperationContract]
   new string DoWorkA();
}

但我认为你想要做的是将较小的接口聚合成一个更大的服务。然后,您的模块可以与易于理解的界面(这是服务界面的子集)进行交互。

例如:

public interface IWarehouse : IShipping, IReceiving, IInventory, IMovement {}

我们实施了类似的东西。

  • 我们在共享程序集中定义了所有服务契约,并使用了客户端和服务器上的接口。
  • 我们创建了实现这些接口的客户端代理。

然后,客户端可以使用整个服务接口的更简单的子集与客户端代理进行交互。

首先定义接口:

[ServiceContract]
public interface IServiceA
{
    [OperationContract]
    string DoWorkA(); 
}

[ServiceContract]
public interface IServiceB
{
    [OperationContract]
    string DoWorkB();
}

[ServiceContract]
public interface IGetData : IServiceA, IServiceB
{
}

然后创建代理(您也可以在这里使用ChannelFactory):

public class ServiceClientA : ClientBase<IGetData>, IServiceA
{
    public string DoWorkA()
    {
        return Channel.DoWorkA();
    }
}

public class ServiceClientB : ClientBase<IGetData>, IServiceB
{
    public string DoWorkB()
    {
        return Channel.DoWorkB();
    }
}

以上内容与您的MyClass类似。

然后客户端可以使用单个界面:

IServiceA clientA = new ServiceClientA();
string result = clientA.DoWorkA();

IServiceB clientB = new ServiceClientB();
result = clientB.DoWorkB();

如果需要,您也可以在此处创建服务工厂。

我希望能给你一些想法。

答案 1 :(得分:0)

几点:

  • 您的客户不需要实施IServiceA。这是为什么?您的客户端只需引用您的WCF服务即可使用该服务。
  • 您的界面IServiceA在给定方案中似乎是多余的。它没有带来任何好处。 IMO你可以住IGetData。这是您实施服务合同的地方。如果您愿意,可以将此界面重命名为IServiceA。

要回答您有许多模块需要从服务中获取数据的观点,您能否将这些模块分类为业务/功能性质?如果是,那么您可以为每个业务/功能创建不同的WCF服务,并且相应的模块将调用相应的服务。除此之外,我不明白为什么不应该允许一个模块从多个服务收集数据。这是完全可以接受的情况。

HTH