Asp.net mvc 从模型内部还是外部调用web服务?

Asp.net mvc 从模型内部还是外部调用web服务?,asp.net-mvc,web-services,architecture,Asp.net Mvc,Web Services,Architecture,我正在寻找有关我正在创建的应用程序架构的一些指导。情况如下: 我们公司向销售人员发放奖励卡,然后再分发给客户(就像借记卡一样使用)。出于跟踪目的,销售人员必须在使用该卡之前请求我们的系统激活(提供有关他们将该卡提供给谁以及原因的信息)。面向前端的应用程序是ASP.NET MVC 2。windows服务将定期检查激活请求,并从发卡公司(实际上涉及两家卡公司和两家服务)呼叫web服务来激活该卡。然后,它将卡的状态标记为在DB中激活 我的解决方案分为5个项目:Web、数据(模型和存储库)、公司客户(访

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

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

我的解决方案分为5个项目:Web、数据(模型和存储库)、公司客户(访问两个Web服务)、服务(windows服务)和测试

就目前情况而言,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();
}
这是行得通的,但我还是忍不住想到了这个问题。我是否应该向卡中添加一个名为Activate()的方法,该方法获取web服务客户端并尝试真正的激活和日志记录本身?这将使windows服务更加干净:

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

    foreach (var card in cards)
    {
        card.Activate();
    }
    repo.Save();
}
但是,这需要数据项目引用公司客户。CompanyClients本身已经引用了数据,因此这将创建一个循环依赖项。我可以把这两个项目放在一起,但我觉得这不对(事实上,我希望最终去POCO,将模型和数据访问划分到不同的项目)


有没有更好的组织方式的想法?

是的,我理解你的问题,你是在问是否可以将DataAccess方法放在模型类上,还是放在客户机上,这是一个包含访问web服务的方法的项目

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

此外,客户机与web服务建立连接的概念也感觉不正确。客户还应该进入模型项目。您现在用来连接webservices的代码应该转移到一个名为WebServiceProxy或类似项目的单独项目中

该项目应遵循以下原则。链接的文章实际上讨论了与Web服务相关的存储库模式(除了通常的数据库存储库)


HTH

最后,关于是否从Card类内部或外部调用的答案来自于从OO的角度对其进行更深入的思考。虽然乍一看将这些功能组合在一起似乎很好,但卡本身激活是没有意义的。所以在任何情况下,这都不属于卡片类


至于如何分离到不同的项目,我认为是有意义的,它使用了一个单独的界面,有一个很好的教程:。

谢谢。我目前确实有一个代理类,它实现了客户端访问的接口。我将客户端与代理放在同一个项目中,这样我的域就不必处理自动生成的类型化数据集,但您可能认为它应该在一起。