关键字:Web Services Software Factory,Data Contracts,Business Entities
如果你已经错过了本系列的第一部分,请单击这里。您将需要完成的第一部分的教程,安装和设置好您的环境。在这部分您将创建的数据契约、服务契约及业务实体。就像典型的web services,您应该只关注您的业务逻辑和业务实体。以构建自己的WCF。我们继续,载入您的MyCryptographyService解决方案项目。
右键单击MyCryptographyService.model项目(注意,不是解决方案,而是下面带小图标的),并选择Add –> New Model。
选择创建一个新的“Data Contract Model”(数据契约模块) 。填写Mode name(模块名称)为CryptographyService.DataContracts和XML Namespace(XML命名空间)为http://www.cnblogs.com/LiYunQi/ 。
你现在应该有一个空白的设计区域。并且右侧将出现新的Data Contract Exploeer 窗口。点击该空白色设计区域,然后查看属性窗口。单击“Implementation Technology”,并选择“WCF Extension” 。
您还需要设置 Project Mapping table项目映射表的合同。这是XML文档(默认情况下,在ProjectMapping.xml,标记了 WSSF中作用于每一个项目和自动生成代码的说明。此文件可以编辑和修改)。设置Project Mapping table为我们刚刚建立的MyCryptographyService 。
打开左侧的工具箱,您会发现适应当前设计区域的一些工具,包括用于可序列化对象的Data Contract(数据契约)。用于枚举类型的Data Contract Enumeration(数据契约枚举)。用于NET数据类型的Primitive Data Type Collections(原始数据类型)。用于Data Contract Collections(数据契约集合)。用于异常的Fault Contracts(故障契约)等。
接下来您需要从工具箱中将一个Data Contract Enumeration”(数据合同枚举)拖动到设计区域。单击顶端上的名称(默认是DataContractEnum1 ) ,并改名为HashType 。右键单击并选择添加- > Value 分别添加MD5和SHA256的枚举。
拖曳另一数据契约枚举到设计区域,并将其命名为EncryptionAlgorithm1 。添加两个值为DES和Rijndael算法的枚举。当您完成时您设计区域应该是这个样子。
现在,从工具箱上拖动一个“Data Contract”到设计区域。改名为HashObject以相同的方式重新命名列举。右键单击添加新的Primitive Data Type。此属性名称“StringToHash”。
让我们现在就看看你刚刚添加的Primitive Data Type。它有一个Type属性是System.String及order属性为0 。今后可以在这里添加、修改这些属性,现在我们可以接受默认值。
现在,从工具箱选择Aggregation工具,然后按一下HashType枚举,按住鼠标按钮,拖动连接到HashObject 。HashObject将建立一个新的HashType。设置其order为1 。
在设计区域,您的HashObject和HashType看起来应该如下图所示。
您还应该通过拖动建立另一个“Data Contract”,命名为 EncryptionObject。添加Text member 建立好与EncryptionType关联。当您完成时,你应该有这四个对象在您的设计区域。
右键单击空白设计区域的任何地区,并点击“全部验证” 。应该没有任何错误。否则,请检查上述操作步骤。
下一步,右键点击一些空白,并点击“Generate Code”。
在MyCryptographyService.DataContracts项目(在解决方案文件夹Service Interface下)的“Generated Code”文件夹中你会发现,一些类库项目已经生成。请记住,每当您更改您的数据契约,这些类库项目及自动生成的代码将被覆盖。
右键单击MyCryptographyService.BusinessEntities类库项目(Business Logic解决方案文件夹下),并添加一个类。命名为CryptographicEntities.cs 。在这个文件中,我们将确定所有的业务逻辑实体的数据模型,使他们能够在其他地方使用我们的解决方案。通常,你会采取一些你自己的方式来构建业务实体层,本教程中请用以下代码来替换。CryptographicEntities.cs (using部分除外)以下为代码。
namespace MyCryptographyService.BusinessEntities { public enum EncryptionAlgorithm { DES = 0, Rijndael = 1 } public enum HashType { MD5 = 0, SHA256 = 1 } public class EncryptionObject { public string Text { get; set; } public EncryptionAlgorithm EncryptionAlgorithm { get; set; } } public class HashObject { public string StringToHash { get; set; } public HashType HashType { get; set; } } }
现在,右键点击MyCryptographyService.ServiceImplemenation项目,并选择“Create Translator”。
在First Class to map,选择DataContracts.EncryptionObject 。在Second Class to map,选择BusinessEntities.EncryptionObject 。Mapping class name 输入EncryptionObjectTranslator ,Mapping class XNL namespace保持MyCryptographyService.ServiceImplementation 。
在每一个列表框中选择Text属性,并单击map。然后单击完成。你不能手动修改map对话框产生的手动。只要你不在此运行“Create Translator”,您不必担心覆盖手动更改。事实上,我建议一旦你的指导方针和维护手动这样。
重复此过程,这次我们选择HashObjects 。Mapping class name 输入HashObjectTranslator ,在每一个列表框中选择图StringToHash属性。下一步,打开MyCryptographyService.ServiceImplementation项目下生成的代码。应该如下所示: (请注意,我的命名空间别名,使其短,容易与) 。
HashObjectTranslator:
using System; using MyCryptographyService.DataContracts; using MyCryptographyService.BusinessEntities; namespace MyCryptographyService.ServiceImplementation { public static class HashObjectTranslator { public static MyCryptographyService.DataContracts.HashObject TranslateHashObjectToHashObject(MyCryptographyService.BusinessEntities.HashObject from) { MyCryptographyService.DataContracts.HashObject to = new MyCryptographyService.DataContracts.HashObject(); to.StringToHash = from.StringToHash; return to; } public static MyCryptographyService.BusinessEntities.HashObject TranslateHashObjectToHashObject(MyCryptographyService.DataContracts.HashObject from) { MyCryptographyService.BusinessEntities.HashObject to = new MyCryptographyService.BusinessEntities.HashObject(); to.StringToHash = from.StringToHash; return to; } } }
EncryptionObjectTranslator:
using System; using MyCryptographyService.DataContracts; using MyCryptographyService.BusinessEntities; namespace MyCryptographyService.ServiceImplementation { public static class EncryptionObjectTranslator { public static MyCryptographyService.DataContracts.EncryptionObject TranslateEncryptionObjectToEncryptionObject(MyCryptographyService.BusinessEntities.EncryptionObject from) { MyCryptographyService.DataContracts.EncryptionObject to = new MyCryptographyService.DataContracts.EncryptionObject(); to.Text = from.Text; return to; } public static MyCryptographyService.BusinessEntities.EncryptionObject TranslateEncryptionObjectToEncryptionObject(MyCryptographyService.DataContracts.EncryptionObject from) { MyCryptographyService.BusinessEntities.EncryptionObject to = new MyCryptographyService.BusinessEntities.EncryptionObject(); to.Text = from.Text; return to; } } }
现在您应该能够成功地生成您的项目并为第3部分做好了准备。如果您有任何问题,请留下您的评论,我会尽快回复您。下一步,我们将建立和实现服务契约。