我试图了解使用我目前使用的数据库方案生成的XSD表的最佳实践.
1)您认为XSD信息应该作为模型的一部分吗?
2)是否意味着数据访问层返回数据集和其他生成的对象?
3)它是否一直遍历所有系统层到UI?
4)如果XSD是数据访问层的一部分,我应该将结果转换为模型中的对象吗?什么是最佳转换方法?
谢谢,罗尼
您已通过在问题中制作特定于数据集的XSD来限制XSD的用途和应用程序.
XSD是Extensible Scehma Defination的首字母缩写.XSD标准由W3C定义,用于标准化您可能在应用程序中使用的XML文件.
举个例子,您可以在应用程序中大量使用XML文件,您可以使用不同类型的远程源进行交换.这些源可能会以各种格式向您发送XML文件.在您的应用程序中,您需要确保以适当的格式接收XML文件,以便您可以进一步在XML文件上执行业务操作.因此,您需要对这些XML文件实施标准化.您需要根据最终可接受的标准验证XML文件.您需要将XML的架构与标准进行比较.这些标准以XSD形式编写.您将根据XSD文件中定义的模式标准验证XML文件的模式.这是XSD文件的实际用途.
现在回答你的问题..
1.)您认为XSD信息应该作为模型的一部分吗?
因为我只是sais XSD文件存储架构而不是数据.当您使用在运行时实际在内存中保存数据的数据集时,任何应用程序中的方式都相同 - 也将拥有自己的模式,它将保存数据的形式.这些因基础数据表及其关系而异.所以MS人员介绍了TypedDataSets的概念.TypedDataSets - 顾名思义就是数据集的限定模式,您将在运行时使用该模式来使用数据.所以TypedDataSets实际上是以XSD文件的形式定义的,它定义了DataTables的模式以及它们之间的关系.因此,当您在Visual Studio中创建TypedDataSet文件时,它基本上会创建一个XSD文件,将从数据库源添加到TypedDataSet表面的所有表将被分析,并且将在XSD文件中创建每个表的元数据模式.
由于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
所有业务对象的基类,业务对象集合,数据访问类以及我的自定义属性和实用程序作为扩展方法,通用验证框架.这决定了我最终的.net应用程序的整体行为组织.
2.)Application.DataModel
数据库的XSD类型数据集.
TableAdapters扩展为包含我可能需要的事务和其他功能.
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对象作为任何数据访问操作的一部分.业务对象是在反射属性的帮助下创建的.每个业务对象都标记有一个属性映射到数据库中的目标表,业务对象中的属性使用映射到相应数据库表中的目标列的属性进行标记.
我的验证框架允许我在指定的ValidationAttribute的帮助下验证每个字段.
我的framrwork大量使用Attributes来自动化大多数繁琐的任务,如映射和验证.我还可以将新功能作为框架中的新方面.
在我的应用程序中,示例业务对象将如下所示.
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 (IListinitialList) : base(initialList) { } }