我试图了解使用从当前使用的数据库方案生成的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.)应用程序。基础结构
2.) Application.DataModel
3.) Application.DataAccess
4.) Application.DomainObjects
5.)应用程序。BusinessLayer
6.) Application.WebClient 或 Application.WindowsClient
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/