6

考虑到所有应用程序都将与 Web 项目(将使用云或 Web 服务)交互这一事实。有没有办法在应用程序之间共享我的类模型?

如果是,最好的方法是什么?

关于从 Web 服务发送/接收数据、序列化和反序列化,我怎样才能以简单的方式做到这一点,而无需手动填充对象?

有关此应用程序的任何信息都会非常有帮助!

4

6 回答 6

6

一般来说,像这样在应用程序之间共享域模型并不是一个好主意,因为您在它们之间创建了硬依赖关系,即对域模型的任何更改都会影响所有应用程序,从而迫使您同步 Web、电话和桌面应用程序的版本.

我建议创建针对每种应用程序类型的特定信息需求量身定制的单独模型,这当然会增加复杂性,但根据我的经验,与其他场景相比,这是可以管理的。

不确定您的序列化问题,如果您使用 WCF 调用服务,这不是问题,它会为您处理。

为了填充您的域类,我推荐 AutoMapper,我已在多个项目中成功使用过它。它可以根据名称自动从一个类映射到另一个类,您只需指定例外情况(即字段名称未映射,或者您需要某种类型的转换逻辑)github 上的 Automapper

于 2012-07-06T10:24:38.567 回答
3

您可以通过简单的引用在 WPF 和 ASP.net 之间与您的所有类型共享一个 Common.Domain.dll。

然后,您可以在 WCF 客户端和服务器之间共享这些相同类型(参见在线示例,例如http://blog.walteralmeida.com/2010/08/wcf-tips-and-tricks-share-types-between-server- and-client.html ) 允许单独的应用程序域进行通信。

最难的是在 Silverlight 中共享它们,因为 AFAIK silverlight 使用精简的 .net 框架和它自己的编译器。一种技巧是将文件快捷方式添加到 Common.Domain.dll 中定义的 c# 类或使用可移植类库 (http://msdn.microsoft.com/en-us/library/gg597391.aspx)

然而,所有这些共享是否是一个好主意是一个单独的问题,这在很大程度上取决于您的发布策略。

于 2012-07-11T14:01:45.060 回答
3

要在应用程序之间共享域模型,请查看 Microsoft 的Portable Class Libraries Visual Studio 扩展。它包含用于创建可在 WPF、Silverlight 和 Windows Phone 中的一个或多个上运行的库的模板。生成的编译后的 .dll 可以在所有三个平台上使用。

我已使用此项目类型在 WCF 服务及其 Silverlight 使用者之间共享通用 DTO,等等。

对于域模型和 DTO 之间的转换,请查看AutoMapper

于 2012-07-11T20:49:57.143 回答
2

有些人建议不要将服务器端域模型分发给客户端应用程序,而是通过 Web 服务代理生成器生成客户端实体并使用 AutoMap 进行映射,但我更喜欢坚持通过共享 DLL 与客户端共享实体的方法。这有各种优点:

优点

  • 没有双重编码。
  • 没有将代理对象映射到真实对象。因此没有性能损失。
  • 一次在服务器上,然后在客户端实体上没有双重验证实现。
  • 共享引用实体对象的实用程序库。您不必为客户端代理生成的实体再次编写实用程序库,这是一个很大的痛苦。
  • 设计一次,到处重复使用。

缺点

  • 实体库必须是普通的类。没有引用外部库。
  • 无法删除或重命名现有属性。

现在我明白了一些关于服务器实体被改变和破坏客户端代码的反对意见。但在现实生活中,您拥有客户端和服务器,您始终可以向客户端发送新版本。即使您不这样做,您也可以始终对实体的更改进行版本控制,并引入新的服务来发回新版本的实体。破坏兼容性的机会也很低。仅当您删除属性或更改现有实体上的属性名称时,它才会中断。这通常是低概率。以我的经验,它主要是向实体添加新属性。即使您向实体添加新属性,具有旧实体 DLL 的旧客户端仍然可以工作。它还可以反序列化 SOAP 有效负载。

因此,尽管有一些缺点,但在我看来,利大于弊。所以,我总是有一个实体 DLL,它包含我所有的实体作为 POCO,并与客户端应用程序和服务器共享它。

希望这可以帮助。

于 2012-07-09T14:06:13.397 回答
1

我知道有几个选项。

  1. 在您的 Web 服务中定义模型,当您的应用程序添加对服务的引用时,您还将获得模型定义。

  2. 使用文件链接并将您的域文件链接到每个项目(我们目前通过一些魔术来解决客户端和完整 .net 之间的差异(使用自动映射器或反射来填充本地对象)

  3. 您是否将域模型放在每个项目引用的单独项目中

于 2012-07-04T05:18:19.623 回答
0

我会推荐一个非常精简的项目,它可以完成大部分繁重的工作,但仍然为您的项目类型(WPF、ASP.Net 等)提供一个公共层。

由于Domain旨在与所有不同类型的项目一起使用,因此它不能包含并非在所有所需项目类型中都可用的命名空间,这将很困难。

为了解决这个问题,我建议创建一个服务项目,该项目将通过编译器指令为您的项目提供扩展功能,或者服务可以是一个命名空间,每种项目类型都有不同的项目。(这样,当只发送 Silverlight 时,您将发送Services.Silverlight以及和您的 Silverlight 项目。)这将减少编译器指令的数量。

完成上述项目后,您可以开始为所有其他项目创建前端和特定于应用程序的逻辑。然后,您可以使用自动映射器或其他工具将您的(可能)视图模型映射到来自Domain的模型。

如果需要,将服务作为所有核心逻辑的一层将有助于您以后扩展到其他项目类型。

于 2012-07-12T19:56:36.143 回答