【问题标题】:WCF - how can I define services in a more object-oriented way?WCF - 如何以更面向对象的方式定义服务?
【发布时间】:2012-03-26 13:47:35
【问题描述】:

通过 WCF 访问远程对象模型的最佳方式是什么?

我有一个带有面向对象模型的系统层 (A),并希望从另一层 (B) 访问此模型

所需的对象应由 B 按需加载。例如,假设我有 C1 和 C2 类,C1 持有 C2 的列表。此列表应仅在访问时加载。

由于数据合同不能保存操作合同,我将使用一个服务合同来实现这一点,其中有两种方法“getC1”和“getListC2(C1)”

但是,我真正想要的是访问一个面向对象的模型,例如在 C1 上调用函数:C1.getListC2

如何以更加面向对象的方式使用 WCF?

【问题讨论】:

  • 面向服务的体系结构(尤其是 WCF)和面向对象的原则并不总是很好地匹配。 SOA 是关于服务和消息的——通常是具体的东西。它并不真正关心继承和多态性,真的——它需要拥有并处理具体的消息对象。另一方面,OOP 与封装、继承、多态有关。 OOP 服务(实现)中效果很好 - 跨服务边界的 OOP 不那么......
  • 补充@marc_s 所说的内容,您所说的(以及答案所倡导的)是在远程服务上使用相对的Fine Grained Facade。您应该警惕这将如何执行,并且在选择跨远程边界工作时应用的 OO 技术时要务实。

标签: wcf oop datacontract servicecontract


【解决方案1】:

解决此问题的一种方法是使用您自己的延迟加载(和其他)业务逻辑来包装代理对象。换句话说,假设您有一个名为 Order 的 WCF 代理和一个服务方法 GetOrderLineItems()。

public class Order
{
    private Proxies.Order _order;
    private List<OrderLineItem> _lineItems;

    public string Name 
    {
        get { return _order.Name; }
    }

    public List<OrderLineItem> LineItems
    { 
        if (_lineItems == null)
        {
             _lineItems = //Make the service call to get these objects
        }
    }
}

另一种合成方法是将扩展方法添加到您的代理对象:

public static List<Proxies.OrderLineItem> GetLineItems(this Proxies.Order order)
{
     //Make the service call to get the line items
}

你可以这样做:

var lineItems = order.GetLineItems();

【讨论】:

  • 谢谢!我喜欢使用扩展方法的方法!
猜你喜欢
  • 1970-01-01
  • 2019-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-15
  • 2020-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多