【问题标题】:Call a web service from inside or outside the model?从模型内部还是外部调用 Web 服务?
【发布时间】:2010-08-04 16:16:50
【问题描述】:

我正在寻找有关我正在创建的应用程序架构的一些指导。情况如下:

我们公司向销售人员发放奖励卡,然后将其分发给客户(用作借记卡)。出于跟踪目的,销售人员必须在卡可以使用之前从我们的系统请求激活(提供有关他们将卡提供给谁以及原因的信息)。前端应用程序是 ASP.NET MVC 2。Windows 服务将定期检查激活请求并调用发卡公司的 Web 服务(实际上涉及两家卡公司和两项服务)来激活它。然后它在DB中将卡的状态标记为已激活。

我的解决方案分为 5 个项目:Web、Data(模型和存储库)、CompanyClients(访问两个 Web 服务)、Service(Windows 服务)和 Tests。

就目前的情况而言,Windows 服务中的一些代码可能如下所示:

using (var repo = new Repository())
{
    var cards = repo.GetAllPendingCardsWithOrderAndCompany();

    foreach (var card in cards)
    {
        var client = CompanyClientFactory.GetClient(card);

        try
        {
            client.ActivateCard(card);
            card.ActivationDt = DateTime.Now;
        }
        catch(Exception ex)
        {
            // Error logging goes here
        }
    }
    repo.Save();
}

这可行,但我不禁想到Anemic Domain Model的问题。我应该向 Card 添加一个名为 Activate() 的方法,该方法获取 Web 服务客户端并尝试真正的激活和日志记录吗?这将使 Windows 服务更清洁:

using (var repo = new Repository())
{
    var cards = repo.GetAllPendingCardsWithOrderAndCompany();

    foreach (var card in cards)
    {
        card.Activate();
    }
    repo.Save();
}

但是,这需要 Data 项目引用 CompanyClients。 CompanyClients 本身已经引用了 Data,因此这将创建循环依赖。我可以将这两个项目混为一谈,但这对我来说并不合适(事实上,我想最终去 POCO 并将模型和数据访问权拆分到不同的项目)。

有什么更好的组织方式吗?

【问题讨论】:

    标签: asp.net-mvc web-services architecture


    【解决方案1】:

    最终,是从Card类内部还是外部调用的答案来自于从OO的角度更深入地思考它。乍一看,将这些功能组合在一起似乎很不错,但卡片自行激活是没有意义的。所以无论如何,它属于 Card 类之外。

    至于如何分离到各个项目的问题,我认为this answer 是有道理的,它使用了一个独立的接口,对此有一个很好的教程:Refactoring Service Dependencies to Separated Interface

    【讨论】:

      【解决方案2】:

      是的,我理解你的问题,你问是否可以将数据访问方法放在模型类上或将其留在客户端,这是一个包含访问 Web 服务的方法的项目。

      我自己对类似项目也有类似的想法,我决定保持模型类非常简单,它们实际上没有任何方法,只有属性。

      此外,客户端连接到 Web 服务的概念也感觉不对。客户也应该进入模型项目。您现在用来连接到 web 服务的代码应该被移动到一个名为 WebServiceProxy 或类似的单独项目中。

      此项目应遵循Repository/Service pattern。链接的文章实际上讨论了与 Web 服务相关的存储库模式(除了通常的存储库到 DB 的东西)。

      HTH

      【讨论】:

      • 谢谢。我目前确实有一个代理类实现客户端访问的接口。我将客户端与代理放在同一个项目中,这样我的域就不必处理自动生成的类型化数据集,但你可能是对的,它应该放在一起。
      猜你喜欢
      • 2019-06-25
      • 1970-01-01
      • 2014-09-23
      • 2016-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-28
      相关资源
      最近更新 更多