Bạn đã hạn chế mục đích và ứng dụng của XSD bằng cách làm cụ thể để XSD Datasets trong câu hỏi của bạn.
XSD là từ viết tắt của việc mở rộng bệnh suyễn. Các tiêu chuẩn XSD được định nghĩa bởi W3C vì mục đích chuẩn hóa các tệp XML mà bạn có thể sử dụng trong các ứng dụng của mình.
Ví dụ: giả sử bạn đang sử dụng nhiều tệp XML trong ứng dụng mà bạn có thể trao đổi với các loại nguồn từ xa khác nhau. Các nguồn này có thể gửi cho bạn các tệp XML ở các định dạng khác nhau. Trong ứng dụng của bạn, bạn cần đảm bảo nhận tệp XML ở định dạng thích hợp để bạn có thể thực hiện thêm các hoạt động kinh doanh của mình trên tệp XML. Vì vậy, bạn cần thực thi tiêu chuẩn hóa cho các tệp XML đó. Bạn sẽ cần phải xác thực tệp XML dựa vào các tiêu chuẩn có thể chấp nhận được ở cuối của bạn. Bạn sẽ cần so sánh lược đồ XML với các tiêu chuẩn. Các tiêu chuẩn này được viết dưới dạng XSD. Và bạn sẽ xác nhận hợp lệ lược đồ của tệp XML của bạn dựa vào các tiêu chuẩn lược đồ như được định nghĩa trong tệp XSD. Đây là mục đích thực sự của các tệp XSD.
Bây giờ trả lời câu hỏi của bạn ..
1.) Bạn có nghĩ rằng các thông tin XSD nên được đặt như một phần của mô hình?
Vì tôi vừa sais tệp XSD lưu trữ lược đồ chứ không phải dữ liệu. Tương tự như vậy trong bất kỳ ứng dụng nào khi bạn sử dụng Tập dữ liệu thực sự chứa dữ liệu trong bộ nhớ trong thời gian chạy - cũng sẽ có lược đồ riêng của nó, biểu mẫu trong đó nó sẽ giữ dữ liệu. Những thay đổi này dựa trên Datatables cơ bản và quan hệ của chúng. Vì vậy, MS guys giới thiệu khái niệm về TypedDataSets. TypedDataSets - như tên cho thấy là lược đồ đủ điều kiện của Dataset mà bạn sẽ sử dụng vào thời gian chạy để chơi với dữ liệu. Vì vậy, TypedDataSets thực sự được định nghĩa dưới dạng tệp XSD xác định lược đồ của DataTables và các mối quan hệ inbetween. Vì vậy, khi bạn tạo một tệp TypedDataSet trong Visual studio, về cơ bản nó tạo một tệp XSD, Tất cả các bảng mà bạn thêm từ nguồn cơ sở dữ liệu vào bề mặt TypedDataSet sẽ được phân tích và lược đồ siêu dữ liệu của mỗi bảng sẽ được tạo trong tệp XSD. Khi chạy khi bạn chọn các bản ghi vào tập dữ liệu của mình, bạn đã biết loại dữ liệu nào sẽ được đưa vào chúng và nếu dữ liệu không có dạng như được định nghĩa trong XSD, bạn sẽ nhận được một ngoại lệ thời gian chạy.
Vẫn còn XSD không phải là công cụ khi chạy vì Visual studio tạo ra bộ mã hóa dữ liệu từ tập tin XSD bằng cách sử dụng XSD.exe tool.
2) Điều đó có nghĩa là Lớp truy cập dữ liệu trả về Tập dữ liệu và các đối tượng được tạo khác không?
Nếu lớp dữ liệu của bạn đang sử dụng TypedDataset, nó sẽ trả về DataTables hoặc DataRow [] hoặc DataRow khi bạn cần.
3) Hệ thống có chuyển tất cả các lớp hệ thống đến giao diện người dùng không?
Bạn có thể tạo các đối tượng kinh doanh tùy chỉnh ở trên nó là thực tiễn được đề xuất thay vì ném đối tượng Dataset tại đây và trong ứng dụng của bạn.
4) Nếu XSD là một phần của Lớp truy cập dữ liệu, tôi có nên chuyển đổi kết quả thành các đối tượng từ Mô hình không? Phương pháp chuyển đổi tốt nhất là gì?
Viết cơ chế ánh xạ bằng cách sử dụng Phản chiếu. Chúng ta ánh xạ DataRow của chúng ta tới các cá thể đối tượng nghiệp vụ và DataTables đến Bộ sưu tập đối tượng nghiệp vụ.
Bạn có thể bắt đầu thiết kế lại để nâng cấp dự án của mình với kiến trúc bền vững hơn. Và tất nhiên điều này sẽ mất thời gian và công sức nhưng cuối cùng bạn sẽ có kết quả tuyệt vời.
Đây là những gì tôi có trong dự án của mình.
1.) Application.Infrastructure
- lớp cơ sở cho tất cả BusinessObjects, Busines đối tượng bộ sưu tập, các lớp truy cập dữ liệu và các thuộc tính tùy chỉnh của tôi và các tiện ích như các phương pháp mở rộng, khuôn khổ xác nhận Chung. Điều này xác định tổ chức hành vi tổng thể của ứng dụng net cuối cùng của tôi.
2.) Application.DataModel
- XSD Typed Dataset cho cơ sở dữ liệu.
- Các chương được mở rộng để kết hợp các Giao dịch và các tính năng khác mà tôi có thể cần.
3.) Application.DataAccess
- lớp truy cập dữ liệu.
- Nơi thực tế nơi các tác vụ Cơ sở dữ liệu được truy vấn bằng cách sử dụng Tập dữ liệu đã nhập cơ bản.
4.) Application.DomainObjects
- đối tượng kinh doanh và bộ sưu tập đối tượng kinh doanh.
- Enums.
5.) Ứng dụng.BusinessLayer
- Cung cấp các lớp học quản lý truy cập từ lớp Presentation.
- HttpHandlers.
- Lớp cơ sở Trang của riêng tôi.
- More thứ đi đây ..
6.) Application.WebClient hoặc Application.WindowsClient
- lớp trình bày của tôi
- Đưa tài liệu tham khảo từ Application.BusinessLayer và ứng dụng. Những đối tượng kinh doanh.
Application.BusinessObjects được sử dụng trên các ứng dụng và họ đi du lịch trên tất cả các lớp bất cứ khi nào neeeded [trừ Application.DataModel và Application.Infrastructure]
Mọi thắc mắc của tôi được định nghĩa chỉ Application.DataModel.
Application.DataAccess trả về hoặc nhận đối tượng kinh doanh như một phần của bất kỳ thao tác truy cập dữ liệu nào. Các đối tượng nghiệp vụ được tạo ra với sự trợ giúp của các thuộc tính phản chiếu. Mỗi đối tượng nghiệp vụ được đánh dấu bằng ánh xạ thuộc tính để nhắm mục tiêu bảng trong cơ sở dữ liệu và thuộc tính trong đối tượng nghiệp vụ được đánh dấu bằng ánh xạ thuộc tính để nhắm mục tiêu coloumn trong bảng cơ sở dữ liệu tương ứng.
Khung xác thực của tôi cho phép tôi xác thực từng trường với sự trợ giúp của ValidationAttribute được chỉ định.
Khung công việc của tôi sử dụng nhiều thuộc tính để tự động hóa hầu hết các tác vụ tẻ nhạt như lập bản đồ và xác thực. Tôi cũng có thể tính năng mới như một khía cạnh mới trong khuôn khổ.
Đối tượng kinh doanh mẫu sẽ giống như thế này trong ứng dụng của tôi.
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ám ơn nỗ lực :) – Ronny