2010-08-04 133 views
2

我正在寻找一些关于我正在创建的应用程序的体系结构的指导。这里是情况:从模型内部或外部调用Web服务?

我们公司给销售员发奖励卡,然后分发给客户(像借记卡一样使用)。为了进行跟踪,推销员必须在使用该卡之前向我们的系统申请激活(提供关于他们给卡的人以及为什么的信息)。前面的应用程序是ASP.NET MVC 2.Windows服务将定期检查激活请求,并从发出该卡的公司调用Web服务(实际上有两个卡公司和两个涉及的服务)来激活它。然后它将该卡的状态标记为在数据库中激活。

我的解决方案分为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问题的思考。我应该添加一个名为Activate()的方法来获取Web服务客户端并尝试真正的激活和记录本身?这将使Windows服务更清洁:

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

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

但是,这将需要Data项目引用CompanyClients。 CompanyClients本身已经引用数据,所以这会创建一个循环依赖。我可以将这两个项目合并到一起,但这对我来说并不合适(因为它是,我最终想去POCO并将模型和数据分解到不同的项目中)。

有更好的方法来组织这个想法吗?

回答

0

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

我对类似的项目有类似的想法,我决定保留Model类非常简单,他们实际上没有任何方法,只有属性。

此外,客户端与Web服务建立连接的概念也不太合适。客户还应该进入Models项目。你现在用来连接到webservices的代码应该被移动到一个名为WebServiceProxy的独立项目或类似的东西。

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

HTH

+0

谢谢。我目前有一个代理类实现客户端访问的接口。我将客户端与代理放在同一个项目中,因此我的域名不需要处理自动生成的类型化数据集,但是您可能应该将它们放在一起。 – ShawnFumo 2010-08-09 12:21:41

1

最后,是否有来自内部或卡类的外部调用的答案来自一个面向对象角度思考更深刻地了解它。虽然乍看之下将这些功能组合在一起似乎很不错,但卡片自身激活是没有意义的。所以在任何情况下,它都属于Card类之外。

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