2011-04-27 50 views
0

我遇到了一点障碍,虽然我有一个可能的解决方案,我会不介意一些反馈。Visual Studio项目体系结构为更好的可重用性

我的当前的解决方案是这样的:

  • Common(包含数据存取,域和其他杂项类的其他解决方案中使用)
  • Client(WPF客户端)
  • ClientPresentation(WPF客户端逻辑,其中所有视图模型驻留)
  • Service(电子邮件服务)

所有3种解决方案(minus Common)参考解决方案Common用于数据访问。我面临的问题是我的存储库(Common)引用ClientPresentation,因为它返回了一个视图模型列表。现在,当我尝试参考ClientPresentation中的Common时,我收到一条错误消息,提示存在循环拒绝。我应该简单地重构我的数据访问类(在我的情况下的存储库)以返回域对象和映射,然后在稍后的ClientPresentation解决方案中与他们的视图模型相对应?

我确定解决方案很简单,但我希望得到一些反馈。

+0

你为什么要让他们互相引用?从ClientPresentation提供它需要的东西的“硬拷贝”是否会更容易?因此它不需要参考? – FreeSnow 2011-04-27 17:52:45

+0

@DalexL - 解决方案将引用彼此,因为位于'Common'返回视图模型中的存储库和'ClientPresentation'需要'Common'用于数据访问。 – Mike 2011-04-27 17:55:10

回答

4

存储库不应该返回视图模型。这是一个禁忌。

存储库应该返回一个数据对象或业务对象(取决于应用程序的复杂性),然后UI层应该负责在这些对象之上构建视图模型。

3

一种解决方法是按照您的设置,然后将这些域对象手动映射到您的视图模型或使用映射器库(如automapper或valueinjecter)。

第二个解决方案是没有这么多的DLL,除非你打算重新使用它们。

这是您应该回答的问题: 您是否有机会分别重新使用数据访问或视图模型? 如果不合并一个程序集中的所有内容并使用文件夹为项目提供结构:例如数据访问文件夹,视图模型文件夹和视图文件夹? 此解决方案也意味着让您的存储库返回域对象,而不是查看模型,但没有太多dll。

通常人们会从事企业架构而不需要它。

1

我的猜测是您的ClientPresentation方法正在调用您的Common方法,该方法又调用您的ClientPresentation方法。

我有相当于一个Common类(我称它为Global,虽然)。其中,我声明所有方法和变量为static,传入并返回需要使用的任何值。虽然使用static类不会消除循环引用,但它可以帮助找出造成它们的原因。

只是一个虽然。不是一个真正的答案。

编辑:我看到你添加了一点在评论之前,我发布了评论。我不确定这个答案是否有帮助。我开始删除它,但想法总是可以提供意想不到的用途。

1

您的设计很好,但我会将POCO对象返回到ClientPresentation图层。 ClientPresentation图层可以填充ViewModels。很多时候ViewModels包含额外的数据或派生列,所以它们不会直接从存储库填充。

1

您应该通过使用接口或使用可映射到视图模型的模型来将您的VieModels与存储库分离。这些模型可以保留在公共层中,以便您的存储库可以引用该模型而不是视图模型。视图模型最终可能会将该模型作为参考并使用它。

相关问题