请告诉我这是否可行。 我有一个客户端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
}
}
[请假设此模型中实施了回调合约]
为什么我问这个问题是,在我的应用程序中,我有很多模块,每个模块都需要使用自己的方法从服务中获取数据。所以我打算使用类似外观的模式。请告诉我这是否正确????
答案 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)
几点:
要回答您有许多模块需要从服务中获取数据的观点,您能否将这些模块分类为业务/功能性质?如果是,那么您可以为每个业务/功能创建不同的WCF服务,并且相应的模块将调用相应的服务。除此之外,我不明白为什么不应该允许一个模块从多个服务收集数据。这是完全可以接受的情况。
HTH