c# - 在企业应用程序中使用C#XSD类型数据集的最佳实践

标签 c# xsd strongly-typed-dataset

我试图了解使用从当前使用的数据库方案生成的XSD表的最佳实践是什么。

1)您认为XSD信息应作为模型的一部分放置吗?

2)这是否意味着数据访问层返回数据集和其他生成的对象?

3)它是否贯穿所有系统层一直到UI?

4)如果XSD是数据访问层的一部分,我应该将结果转换为模型中的对象吗?什么是最佳转换方法?

谢谢,
罗尼

最佳答案

您已通过使XSD特定于问题中的数据集来限制XSD的用途和应用。

XSD is acronym for Extensible Scehma Defination. XSD standards are defined by W3C for the sake of standardizing XML files that you may use in your applications.



举个例子,您正在应用程序中大量使用XML文件,您可能会与不同类型的远程源进行交换。这些来源可能会以各种格式向您发送XML文件。在您的应用程序中,您需要确保以正确的格式接收XML文件,以便您可以进一步对XML文件执行业务操作。因此,您需要对这些XML文件强制执行标准化。您最终需要根据可接受的标准来验证XML文件。您将需要将XML的架构与标准进行比较。这些标准以XSD形式编写。然后,您将根据XSD文件中定义的架构标准来验证XML文件的架构。这是XSD文件的实际目的。

现在回答您的问题。

1.)您认为XSD信息应该作为模型的一部分来定位吗?

正如我所说的那样,XSD文件存储的是架构而不是数据。当您使用在运行时实际将数据保存在内存中的数据集时,在任何应用程序中都采用相同的方式-还将具有自己的架构,即用来保存数据的形式。这些根据基础数据表及其关系而变化。因此,MS家伙介绍了TypedDataSets的概念。 TypedDataSets-顾名思义,是数据集的合格架构,您将在运行时使用它来处理数据。因此,TypedDataSets实际上是以XSD文件的形式定义的,该文件定义了DataTables的架构及其之间的关系。因此,当您在Visual Studio中创建TypedDataSet文件时,它基本上会创建一个XSD文件。将从数据库源添加到TypedDataSet表面的所有表都将进行分析,并将在XSD文件中创建每个表的元数据架构。在运行时,当您将记录选择到数据集中时,您已经知道要输入哪种数据,并且如果数据不是XSD中定义的格式,则将获得运行时异常。

由于Visual Studio使用 XSD.exe tool 从XSD文件生成了tpyed-dataset代码库,因此XSD仍然无法在运行时发挥作用。

2)是否表示数据访问层返回数据集和其他生成的对象?

如果您的数据层使用TypedDataset,它将根据需要返回DataTables或DataRow []或DataRow。

3)它是否贯穿所有系统层一直到UI?

您可以在其上生成自定义业务对象,这是推荐的做法,而不是在应用程序中四处乱扔数据集对象。

4)如果XSD是数据访问层的一部分,我应该将结果转换为模型中的对象吗?什么是最佳转换方法?

使用反射写一个映射机制。我们将DataRow映射到Business对象实例,将DataTables映射到Business对象集合。

您可以开始重新设计,以使用更可维护的体系结构升级您的项目。当然,这将需要时间和精力,但是最终您将获得出色的结果。

这就是我在项目中所拥有的。

1.)应用程序。基础结构
  • 所有业务对象,业务对象集合,数据访问类以及作为扩展方法的我的自定义属性和实用程序的基类,通用验证框架。这决定了我最终的.net应用程序的整体行为组织。

  • 2.) Application.DataModel
  • 数据库的XSD类型数据集。
  • TableAdapters已扩展,以合并事务和我可能需要的其他功能。

  • 3.) Application.DataAccess
  • 数据访问类。
  • 使用基础类型数据集查询数据库操作的实际位置。

  • 4.) Application.DomainObjects
  • 业务对象和业务对象集合。
  • 枚举。

  • 5.)应用程序。BusinessLayer
  • 提供可从“表示”层访问的管理器类。
  • HttpHandlers。
  • 我自己的Page基类。
  • 更多的东西在这里..

  • 6.) Application.WebClient Application.WindowsClient
  • 我的表示层
  • 从Application.BusinessLayer和Application.BusinessObjects中获取引用。

  • Application.BusinessObjects在整个应用程序中使用,并且在需要时它们会遍历所有层[Application.DataModel和Application.Infrastructure除外]

    我所有的查询仅定义为Application.DataModel。

    Application.DataAccess返回或将Business对象作为任何数据访问操作的一部分。业务对象是在反射属性的帮助下创建的。每个业务对象都标记有映射到数据库中目标表的属性,而业务对象中的属性则标记有映射到相应数据库表中目标列的属性。

    我的验证框架使我可以在指定的ValidationAttribute的帮助下验证每个字段。

    我的框架大量使用“属性”来自动化大多数繁琐的任务,例如映射和验证。我还可以将新功能作为框架中的新方面。

    在我的应用程序中,样本业务对象将看起来像这样。

    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
    /// <summary>
    /// The BookCollection class is designed to work with lists of instances of Book.
    /// </summary>
    public class BookCollection : EntityCollectionBase<Book>
    {
        /// <summary>
        /// Initializes a new instance of the BookCollection class.
        /// </summary>
        public BookCollection()
        {
        }
    
        /// <summary>
        /// Initializes a new instance of the BookCollection class.
        /// </summary>
        public BookCollection (IList<Book> initialList)
            : base(initialList)
        {
        }
    }
    

    关于c# - 在企业应用程序中使用C#XSD类型数据集的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2101112/

    相关文章:

    c# - 有人可以澄清 Entity Framework 和类型化数据集之间的主要区别吗?

    database - 来自数据库的 Winforms 数据跨多种形式

    C# - 计算字符串列表中周围字符的总和

    python - 用于验证 xsd :ID string in Python? 的正则表达式

    xml - 使用 Schematron 和 xsltproc 验证 XSD 架构

    xml - 如何从iso20022 的e-repository 中获取所有基本数据类型的标签?

    .net - 具有存储过程的数据集与 Entity Framework

    c# - ToolStripManager 未恢复 Toolstrips 的位置

    c# - 一个 ASP.NET 页面在 0 毫秒内下载是不是太快了?

    c# - 从散列值中取回值?