C# 跨平台应用程序WPF、ASP.NET、Silverlight、WP7、XAML
考虑到所有应用程序都将与web项目(将使用云或web服务)交互这一事实。。 有没有办法在应用程序之间共享我的类模型 如果是,最好的方法是什么 关于从Webservice发送/接收数据、序列化和反序列化,我如何以一种简单的方式做到这一点而不必手动填充对象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、电话和桌面应用程序的发布 我建议创建单独的模型,以适应每种应用程序类型的特定信息需求,这当然会增加复杂性,但根据我的经验,与其他场景相比,这是可以管理的 不确定您的序列化问题,如果您使用WCF调用服务,这不是问题,它会为您处理
为了填充您的域类,我建议使用AutoMapper,我已经在几个项目中成功使用过它。它可以根据名称自动从一个类映射到另一个类,您只需指定例外情况(即字段名不映射或您需要某种类型的转换逻辑)有些人建议不要将服务器端域模型分发到客户端应用程序,而是通过webservice代理生成器生成客户端实体,并使用AutoMap进行映射,但我更愿意坚持通过共享DLL与客户端共享实体的方法。这有多种优点: 专业人士
- 没有双重编码
- 没有将代理对象映射到真实对象。因此没有性能损失
- 在服务器端实体和客户端实体上都没有双重验证实现
- 共享引用实体对象的实用程序库。不必为客户端代理生成的实体再次编写实用程序库,这是一个很大的难题
- 一次设计,处处重用
- 实体库必须是普通类。不引用外部库
- 无法删除或重命名现有属性
希望这能有所帮助。您可以通过简单的引用,在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项目。)这将减少