在企业应用程序中使用C#XSD类型数据集的最佳实践
我正在尝试了解使用从我当前使用的数据库方案生成的XSD表的最佳实践。
1)您认为XSD信息应该作为模型的一部分吗?
2)是否意味着数据访问层返回数据集和其他生成的对象?
3)它是否遍历所有系统层到UI?
4)如果XSD是数据访问层的一部分,我应该将结果转换为模型中的对象吗? 什么是最佳转换方法?
谢谢,罗尼
您通过在问题中制作特定于数据集的XSD来限制XSD的目的和应用。
XSD是Extensible Scehma Defination的首字母缩写。 XSD标准由W3C定义,用于标准化您可能在应用程序中使用的XML文件。
举个例子,您可以在应用程序中大量使用XML文件,这些文件可以与不同类型的远程源交换。 这些源可能会以各种格式向您发送XML文件。 在您的应用程序中,您需要确保以适当的格式接收XML文件,以便您可以在XML文件上进一步执行业务操作。 因此,您需要对这些XML文件实施标准化。 您需要根据最终的可接受标准validationXML文件。 您需要将XML架构与标准进行比较。 这些标准以XSDforms编写。 您将根据XSD文件中定义的模式标准validationXML文件的模式。 这是XSD文件的实际用途。
现在回答你的问题..
1.) 您认为XSD信息应该作为模型的一部分吗?
因为我只是sais XSD文件存储架构而不是数据。 当您使用在运行时实际在内存中保存数据的数据集时,任何应用程序中的方式都相同 – 也将拥有自己的模式,它将保存数据的forms。 这些因基础数据表及其关系而异。 所以MS人员介绍了TypedDataSets的概念。 TypedDataSets – 顾名思义是数据集的限定模式,您将在运行时使用该模式来使用数据。 所以TypedDataSets实际上是以XSD文件的forms定义的,它定义了DataTables的模式以及它们之间的关系。 因此,当您在Visual Studio中创建TypedDataSet文件时,它基本上会创建一个XSD文件,将分析您从数据库源添加到TypedDataSet表面的所有表,并在XSD文件中创建每个表的元数据模式。 在运行时,当您在数据集中选择记录时,您已经知道它们将进入何种类型的数据,如果数据不是XSD中定义的forms,您将获得运行时exception。
由于Visual Studio通过使用XSD.exe工具从XSD文件生成tpyed-dataset代码库,因此仍然无法在运行时运行XSD。
2) 是否意味着数据访问层返回数据集和其他生成的对象?
如果您的数据层使用TypedDataset,它将根据需要返回DataTables或DataRow []或DataRow。
3) 它是否遍历所有系统层到UI?
您可以在其上生成自定义业务对象,这是建议的做法,而不是在应用程序中抛出数据集对象。
4) 如果XSD是数据访问层的一部分,我应该将结果转换为模型中的对象吗? 什么是最佳转换方法?
使用Reflection编写映射机制。 我们将DataRow映射到Business对象实例,将DataTable映射到Business对象集合。
您可以开始重新设计以使用更易维护的架构来升级您的项目。 当然,这需要时间和精力,但最终你会有很好的结果。
这就是我在项目中所拥有的。
1.) Application.Infrastructure
- 所有业务对象的基类,业务对象集合,数据访问类以及我的自定义属性和实用程序作为扩展方法,通用validation框架。 这决定了我最终的.net应用程序的整体行为组织。
2.) Application.DataModel
- 数据库的XSD类型数据集。
- TableAdapters扩展到包含我可能需要的事务和其他function。
3.) Application.DataAccess
- 数据访问类。
- 使用基础类型化数据集查询数据库操作的实际位置。
4.) Application.DomainObjects
- 业务对象和业务对象集合。
- 枚举。
5.) Application.BusinessLayer
- 提供可从Presentation层访问的管理器类。
- HttpHandlers的。
- 我自己的Page基类。
- 更多的事情去这里..
6.) Application.WebClient或Application.WindowsClient
- 我的表示层
- 从Application.BusinessLayer和Application.BusinessObjects获取引用。
Application.BusinessObjects在整个应用程序中使用,并且每当需要时它们都会遍历所有层[Application.DataModel和Application.Infrastructure除外]
我的所有查询都只定义了Application.DataModel。
Application.DataAccess返回或接受Business对象作为任何数据访问操作的一部分。 业务对象是在reflection属性的帮助下创建的。 每个业务对象都标记有一个属性映射到数据库中的目标表,业务对象中的属性使用映射到相应数据库表中的目标列的属性进行标记。
我的validation框架允许我在指定的ValidationAttribute的帮助下validation每个字段。
我的framrwork大量使用Attributes来自动执行大多数繁琐的任务,如映射和validation。 我还可以将新function作为框架中的新方面。
在我的应用程序中,示例业务对象将如下所示。
User.cs
[TableMapping("Users")] public class User : EntityBase { #region Constructor(s) public AppUser() { BookCollection = new BookCollection(); } #endregion #region Properties #region Default Properties - Direct Field Mapping using DataFieldMappingAttribute private System.Int32 _UserId; private System.String _FirstName; private System.String _LastName; private System.String _UserName; private System.Boolean _IsActive; [DataFieldMapping("UserID")] [DataObjectFieldAttribute(true, true, false)] [NotNullOrEmpty(Message = "UserID From Users Table Is Required.")] public override int Id { get { return _UserId; } set { _UserId = value; } } [DataFieldMapping("UserName")] [Searchable] [NotNullOrEmpty(Message = "Username Is Required.")] public string UserName { get { return _UserName; } set { _UserName = value; } } [DataFieldMapping("FirstName")] [Searchable] public string FirstName { get { return _FirstName; } set { _FirstName = value; } } [DataFieldMapping("LastName")] [Searchable] public string LastName { get { return _LastName; } set { _LastName = value; } } [DataFieldMapping("IsActive")] public bool IsActive { get { return _IsActive; } set { _IsActive = value; } } #region One-To-Many Mappings public BookCollection Books { get; set; } #endregion #region Derived Properties public string FullName { get { return this.FirstName + " " + this.LastName; } } #endregion #endregion public override bool Validate() { bool baseValid = base.Validate(); bool localValid = Books.Validate(); return baseValid && localValid; } }
BookCollection.cs
/// /// The BookCollection class is designed to work with lists of instances of Book. /// public class BookCollection : EntityCollectionBase { /// /// Initializes a new instance of the BookCollection class. /// public BookCollection() { } /// /// Initializes a new instance of the BookCollection class. /// public BookCollection (IList initialList) : base(initialList) { } }