Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wcf 服务契约实现另一个接口_Wcf_Interface - Fatal编程技术网

Wcf 服务契约实现另一个接口

Wcf 服务契约实现另一个接口,wcf,interface,Wcf,Interface,请告诉我这是否可能。 我有一个客户端win form应用程序和一个C语言的wcf应用程序。这是我的模型 共同项目 我没有在公共项目中使用ServiceContract或OperationContract属性 现在,ClientProject引用公共项目。 ServiceProject还引用公共项目 在ServiceProject中,我使用的服务合同如下所示: [ServiceContract] public interface IGetData : IServiceA { // Imple

请告诉我这是否可能。 我有一个客户端win form应用程序和一个C语言的wcf应用程序。这是我的模型

共同项目 我没有在公共项目中使用ServiceContract或OperationContract属性

现在,ClientProject引用公共项目。 ServiceProject还引用公共项目

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

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


public class MyService : IGetData
{
    string DoWorkA()
     {

     }
}
在客户端 [请假设在此模型中实现了回调契约]

我问这个问题的原因是,在我的应用程序中,我有很多模块,每个模块都需要使用自己的方法从服务中获取数据。因此,我计划使用一种类似立面的图案。请告诉我这是否正确???

几点:

您的客户不需要实现iSeries。为什么呢?您的客户端只需引用您的WCF服务即可使用该服务。 在给定场景中,您的接口IServiceA似乎是多余的。它没有带来任何好处。在我看来,你可以活下去。这就是您实施服务合同的地方。如果您愿意,可以将此接口重命名为IServiceA。 为了回答您的问题,您有许多需要从服务中获取数据的模块,您能否按业务/功能性质对这些模块进行分类?如果是,那么您可以为每个业务/功能创建不同的WCF服务,相应的模块将调用相应的服务。除此之外,我不明白为什么一个模块不能从多个服务收集数据。这是完全可以接受的情况


HTH

您编写的代码会生成一条警告,因为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 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
{
}
public class ServiceClientA : ClientBase<IGetData>, IServiceA
{
    public string DoWorkA()
    {
        return Channel.DoWorkA();
    }
}

public class ServiceClientB : ClientBase<IGetData>, IServiceB
{
    public string DoWorkB()
    {
        return Channel.DoWorkB();
    }
}
IServiceA clientA = new ServiceClientA();
string result = clientA.DoWorkA();

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