C# 跨平台应用程序WPF、ASP.NET、Silverlight、WP7、XAML

C# 跨平台应用程序WPF、ASP.NET、Silverlight、WP7、XAML,c#,asp.net,.net,wpf,design-patterns,C#,Asp.net,.net,Wpf,Design Patterns,考虑到所有应用程序都将与web项目(将使用云或web服务)交互这一事实。。 有没有办法在应用程序之间共享我的类模型 如果是,最好的方法是什么 关于从Webservice发送/接收数据、序列化和反序列化,我如何以一种简单的方式做到这一点而不必手动填充对象 有关此应用程序的任何信息都将非常有用 我知道有几个选择 在web服务中定义模型,当应用程序添加对服务的引用时,还将获得模型定义 使用文件链接,并将您的域文件链接到每个项目(目前,我们在客户端和完整.net之间的差异上使用了一些魔术(使用自动映射或

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

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

关于从Webservice发送/接收数据、序列化和反序列化,我如何以一种简单的方式做到这一点而不必手动填充对象


有关此应用程序的任何信息都将非常有用

我知道有几个选择

  • 在web服务中定义模型,当应用程序添加对服务的引用时,还将获得模型定义

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

  • 您是否在各自引用的单独项目中拥有域模型


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

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

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


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

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

    专业人士

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

    • 实体库必须是普通类。不引用外部库
    • 无法删除或重命名现有属性
    现在我了解到,对于服务器实体被更改和破坏客户端代码存在一些反对意见。但是在现实生活中,在您拥有客户端和服务器的情况下,您始终可以将新版本发送给客户端。即使您不这样做,您也可以始终将更改版本发送给实体,并引入新的服务发送回实体的新版本。破坏兼容性的可能性也很低。只有在删除实体上的属性或更改现有实体上的属性名称时,兼容性才会中断。这通常是很低的概率。根据我的经验,它主要是向实体添加新属性。即使向实体添加新属性,旧客户端也会保存旧的实体DLL仍然有效。它可以stll反序列化SOAP有效负载

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


    希望这能有所帮助。

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

    然后,您可以在WCF客户端和服务器上共享这些相同的类型(请参阅联机示例,例如),从而允许单独的应用程序域进行通信

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


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

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

    我使用此项目类型在WCF服务及其Silverlight消费者之间共享公共DTO,以及其他内容


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

    我建议使用一个非常精简的项目,该项目承担了大量繁重的工作,但仍然为您的项目类型(WPF、ASP.Net等)提供了一个通用层

    由于适用于所有不同类型的项目,因此它不能包含在所有所需项目类型中都不可用的命名空间,这将很困难

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