您通过使 XSD 特定于您的问题中的数据集来限制 XSD 的用途和应用。
XSD 是 Extensible Scehma Defination 的首字母缩写。定义了 XSD 标准
W3C 为了标准化
您可以在您的文件中使用的 XML 文件
应用程序。
举个例子,您在应用程序中大量使用 XML 文件,您可以与不同类型的远程源进行交换。这些来源可能会向您发送各种格式的 XML 文件。在您的应用程序中,您需要确保以正确的格式接收 XML 文件,以便您可以进一步对 XML 文件执行业务操作。因此,您需要对这些 XML 文件实施标准化。您最终需要根据可接受的标准验证 XML 文件。您需要将 XML 的模式与标准进行比较。这些标准以 XSD 形式编写。您将根据 XSD 文件中定义的模式标准验证 XML 文件的模式。这是 XSD 文件的实际用途。
现在回答你的问题..
1.) 您认为 XSD 信息应该作为模型的一部分吗?
正如我所说,XSD 文件存储的是架构而不是数据。在任何应用程序中,当您使用在运行时实际将数据保存在内存中的数据集时,同样的方式 - 也将具有自己的模式,即保存数据的形式。这些因基础数据表及其关系而异。所以微软的家伙引入了 TypedDataSets 的概念。 TypedDataSets - 顾名思义,是数据集的限定模式,您将在运行时使用它来处理数据。所以 TypedDataSets 实际上是以 XSD 文件的形式定义的,该文件定义了 DataTables 的模式和它们之间的关系。因此,当您在 Visual Studio 中创建 TypedDataSet 文件时,它基本上会创建一个 XSD 文件,您从数据库源添加到 TypedDataSet 表面的所有表都将被分析,并且每个表的元数据架构都将在 XSD 文件中创建。在运行时,当您将记录选择到数据集中时,您已经知道进入它们的数据类型,如果数据不是 XSD 中定义的格式,您将收到运行时异常。
XSD 在运行时仍然没有帮助,因为 Visual Studio 使用 XSD.exe tool 从 XSD 文件生成 tpyed-dataset 代码库。
2) 是否意味着数据访问层返回Datasets和其他生成的对象?
如果您的数据层使用 TypedDataset,它将根据需要返回 DataTables 或 DataRow[] 或 DataRow。
3) 它是否通过所有系统层一直到 UI?
您可以在其之上生成自定义业务对象,这是推荐的做法,而不是在应用程序中到处乱扔数据集对象。
4) 如果 XSD 是数据访问层的一部分,我应该将结果转换为模型中的对象吗?什么是最佳转换方法?
使用反射编写映射机制。我们将 DataRow 映射到业务对象实例,将 DataTables 映射到业务对象集合。
您可以开始重新设计,以使用更易于维护的架构升级您的项目。当然,这需要时间和精力,但最终你会得到很好的结果。
这就是我的项目中的内容。
1.) Application.Infrastructure
- 所有业务对象的基类、业务对象集合、数据访问类以及我的自定义属性和实用程序作为扩展方法,通用验证框架。这决定了我最终的 .net 应用程序的整体行为组织。
2.) Application.DataModel
- 数据库的 XSD 类型数据集。
- TableAdapters 已扩展以包含我可能需要的事务和其他功能。
3.) Application.DataAccess
- 数据访问类。
- 使用底层类型化数据集查询数据库操作的实际位置。
4.) Application.DomainObjects
5.) Application.BusinessLayer
- 提供可从表示层访问的管理器类。
- HttpHandlers。
- 我自己的 Page 基类。
- 这里有更多内容..
6.) Application.WebClient 或 Application.WindowsClient
- 我的表示层
- 从 Application.BusinessLayer 和 Application.BusinessObjects 获取引用。
Application.BusinessObjects 在整个应用程序中使用,并在需要时跨越所有层 [Application.DataModel 和 Application.Infrastructure 除外]
我所有的查询都只定义了 Application.DataModel。
Application.DataAccess 作为任何数据访问操作的一部分返回或获取业务对象。业务对象是在反射属性的帮助下创建的。每个业务对象都标有到数据库中目标表的属性映射,业务对象中的属性标有与相应数据库表中目标列的属性映射。
我的验证框架允许我在指定的 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)
{
}
}