Я пытаюсь понять то, что является лучшей практикой с помощью таблиц XSD, сгенерированных из схемы Database, которую я в настоящее время использую.
1) Вы думаете, что информация о XSD должна быть расположена как часть Модели?
2) Это означает, что Уровень доступа к данным возвращает Наборы данных и другие сгенерированные объекты?
3) Это проходит все системные слои полностью к UI?
4) Если XSD является частью Уровня доступа к данным, я должен преобразовать результаты в объекты из Модели? Что такое лучшая методология преобразования?
Спасибо, Ronny
Очень похожий вопрос здесь . Я предлагаю отказаться от длительного процесса и вернуть пользователю индикатор выполнения на основе ajax. Таким образом, они пользователи имеет роскошь веб-интерфейса, и у вас есть роскошь никаких тайм-аутов.
-121--3787409-Попробуйте
Regex.Replace(YOURTEXT, "(.{8})", "$1 ");
-121--4950751- Вы ограничили назначение и приложения XSD, сделав XSD специфичными для наборов данных в вашем вопросе.
XSD - аббревиатура расширяемой дефинации Scehma. Определены стандарты XSD W3C ради стандартизации XML-файлы, которые можно использовать в приложения.
Например, в приложении широко используются XML-файлы, которыми можно обмениваться с различными типами удаленных источников. Эти источники могут отправлять файлы XML в различных форматах. В приложении необходимо обеспечить получение XML-файла в правильном формате, чтобы можно было выполнять бизнес-операции с XML-файлом. Поэтому необходимо обеспечить стандартизацию этих XML-файлов. Необходимо проверить XML-файл на соответствие приемлемым стандартам в конце. Необходимо сравнить схему XML со стандартами. Эти стандарты написаны в форме XSD. Также выполняется проверка схемы XML-файла на соответствие стандартам схемы, определенным в XSD-файле. Это фактическое назначение XSD-файлов.
Теперь ответьте на ваши вопросы..
1.) Считаете ли вы, что информация XSD должна быть найдена как часть модели?
Поскольку я только что сказал, что файл XSD хранит схему, а не данные. Таким же образом в любом приложении при использовании наборов данных, которые фактически содержат данные в памяти во время выполнения, будет также иметь собственную схему, форму, в которой они будут хранить данные. Они различаются в зависимости от базовых таблиц данных и их отношений. Так MS ребята ввели понятие TypedDataSets. TypedDataSets - как предполагает имя, являются квалифицированной схемой набора данных, который будет использоваться во время выполнения для воспроизведения данных. Таким образом, TypedDataSets фактически определяются в виде XSD-файла, который определяет схему DataTables и взаимосвязи между ними. Таким образом, при создании файла TypedDataSet в Visual Studio в основном создается XSD-файл. Все таблицы, добавляемые из источника базы данных на поверхность TypedDataSet, будут проанализированы, а схема метаданных каждой таблицы будет создана в XSD-файле. Во время выполнения при выборе записей в наборе данных вы уже знаете, какой тип данных поступает в них, и если данные находятся не в форме, определенной в XSD, вы получите исключение во время выполнения.
По-прежнему XSD не являются инструментальными во время выполнения, поскольку Visual Studio генерирует базу кодов набора данных tpyed из файла XSD с помощью инструмента XSD.exe .
2) это означает, что Слой Доступа к данным возвращает Наборы данных и другие произведенные объекты?
, Если Ваш слой данных использует TypedDataset, Он возвратит DataTables или DataRow [] или DataRow, как вам нужно.
3) Проходит ли он через все уровни системы все пути к пользовательскому интерфейсу?
Поверх него можно создавать пользовательские бизнес-объекты, что является рекомендуемой практикой, а не выбрасывать объекты Dataset в приложение.
4) Если XSD является частью уровня доступа к данным, следует ли преобразовывать результаты в объекты из модели? Что лучше всего использовать для преобразования?
Запишите механизм отображения с помощью Reflection. Мы сопоставляем экземпляры DataRow с экземплярами бизнес-объектов и DataTables с коллекциями бизнес-объектов.
Вы можете начать перепроектирование, чтобы увеличить масштаб проекта с помощью более ремонтопригодной архитектуры. И, конечно, это потребует времени и усилий, но в конечном итоге у вас будут отличные результаты.
Это то, что у меня есть в проекте.
1.) Приложение .Инфраструктура
2.) Application.DataModel
3.) Application.DataAccess
4.) Application.StartObjects
5.) .Бус Приложения Слой
6.) Приложение .WebClient или Приложений .WindowsClient
Application.StartObjects используются в приложении и перемещаются по всем уровням, когда это необходимо [кроме 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)
{
}
}