WCF Nest 服务
WCF Nest Services
我正在设计一个 SOA 结构来整合大量 WCF Web 服务。根据我的经验,每当使用 Web 服务时,我们都被限制在非常扁平的结构中:
Web 服务 - https://services.site.com/service.svc
- 操作 1
- 行动2
- 等等
因此,在上面的示例中,我们有一个服务,其中包含一组可用的操作。
但是,我们希望可用的操作具有更多的层次结构。例如:
Web 服务 - https://services.site.com/service.svc
想要这样做的原因是我们可以在对服务进行编码调用时在客户端使用点表示法,例如:
- myService.Clients.CreateClient(参数)
- myService.Clients.Documents.GetDocumentsForClient(参数)
- myService.Products.CreateProduct(参数)
有人可以建议这是否可能吗?
我认为蒂姆的评论是正确的。你试图做的是非常不正统的。
创建一个公开不相关操作的层次结构的服务不是服务的目的。以同样的方式,你不会创建一个做 10 种不同事情的上帝对象,通过二进制引用在进程内使用,你不应该尝试在进程外做它。
如果点符号在客户端对您很重要,那么您可以通过执行以下操作来获得您正在寻找的内容。
编写您的服务端点
namespace Clients
{
[ServiceContract]
interface IService
{
[OperationContract]
void CreateClient(params p);
}
}
namespace Clients.Documents
{
[ServiceContract]
interface IService
{
[OperationContract]
List<Document> GetDocumentsForClient(Guid clientKey);
}
}
namespace Products
{
[ServiceContract]
interface IService
{
[OperationContract]
void CreateProduct(params p);
}
}
使用您的服务端点
var service = new ChannelFactory<Clients.IService>().CreateChannel();
var service = new ChannelFactory<Clients.Documents.IService>().CreateChannel();
var service = new ChannelFactory<Products.IService>().CreateChannel();
如您所见,您可以使用服务合同的完全限定名称来消费相关服务操作。这为您提供了所需的点分隔格式。
使用这种方法,您将不得不让您的客户端引用包含服务和操作契约的程序集,而不是通过服务引用,后者将删除服务命名空间并将其替换为本地生成的命名空间。要实现这一点,您应该将服务和数据契约构建到服务实现的单独程序集中,以便共享。
...how (to) route their calls to my service(s) - as they wont have
used the 'Add Service Reference' functionality of visual studio to
wire up the URLs / Endpoints
根据下面 Tim 的评论,作为替代方案,您可以将配置文件中的服务配置元素的名称注入 ChannelFactory 构造函数,如 here 所述。
我正在设计一个 SOA 结构来整合大量 WCF Web 服务。根据我的经验,每当使用 Web 服务时,我们都被限制在非常扁平的结构中:
Web 服务 - https://services.site.com/service.svc
- 操作 1
- 行动2
- 等等
因此,在上面的示例中,我们有一个服务,其中包含一组可用的操作。
但是,我们希望可用的操作具有更多的层次结构。例如:
Web 服务 - https://services.site.com/service.svc
想要这样做的原因是我们可以在对服务进行编码调用时在客户端使用点表示法,例如:
- myService.Clients.CreateClient(参数)
- myService.Clients.Documents.GetDocumentsForClient(参数)
- myService.Products.CreateProduct(参数)
有人可以建议这是否可能吗?
我认为蒂姆的评论是正确的。你试图做的是非常不正统的。
创建一个公开不相关操作的层次结构的服务不是服务的目的。以同样的方式,你不会创建一个做 10 种不同事情的上帝对象,通过二进制引用在进程内使用,你不应该尝试在进程外做它。
如果点符号在客户端对您很重要,那么您可以通过执行以下操作来获得您正在寻找的内容。
编写您的服务端点
namespace Clients
{
[ServiceContract]
interface IService
{
[OperationContract]
void CreateClient(params p);
}
}
namespace Clients.Documents
{
[ServiceContract]
interface IService
{
[OperationContract]
List<Document> GetDocumentsForClient(Guid clientKey);
}
}
namespace Products
{
[ServiceContract]
interface IService
{
[OperationContract]
void CreateProduct(params p);
}
}
使用您的服务端点
var service = new ChannelFactory<Clients.IService>().CreateChannel();
var service = new ChannelFactory<Clients.Documents.IService>().CreateChannel();
var service = new ChannelFactory<Products.IService>().CreateChannel();
如您所见,您可以使用服务合同的完全限定名称来消费相关服务操作。这为您提供了所需的点分隔格式。
使用这种方法,您将不得不让您的客户端引用包含服务和操作契约的程序集,而不是通过服务引用,后者将删除服务命名空间并将其替换为本地生成的命名空间。要实现这一点,您应该将服务和数据契约构建到服务实现的单独程序集中,以便共享。
...how (to) route their calls to my service(s) - as they wont have used the 'Add Service Reference' functionality of visual studio to wire up the URLs / Endpoints
根据下面 Tim 的评论,作为替代方案,您可以将配置文件中的服务配置元素的名称注入 ChannelFactory 构造函数,如 here 所述。