Вы можете начать редизайн, чтобы расширить ваш проект с помощью более удобной архитектуры. И, конечно, это потребует времени и усилий, но в итоге вы получите отличные результаты.
Это то, что у меня есть в моем проекте.
1.) Application.Infrastructure
- Базовые классы для всех бизнес-объектов, коллекции бизнес-объектов, классы доступа к данным и мои пользовательские атрибуты и утилиты в качестве методов расширения, общая структура проверки. Это определяет общую организацию поведения моего окончательного приложения .net.
2.) Application.DataModel
- Типизированный набор данных для базы данных.
- Адаптеры таблиц расширены для включения транзакций и других функций, которые могут мне понадобиться.
3.) Application.DataAccess
- Классы доступа к данным.
- Фактическое место, где действия базы данных запрашиваются с использованием базового набора типизированных данных.
4.) Application.DomainObjects
- Бизнес-объекты и коллекции бизнес-объектов.
- Перечисления.
5.) Application.BusinessLayer
- Предоставляет классы менеджера, доступные на уровне презентации.
- HttpHandlers.
- Базовый класс моей собственной страницы.
- Здесь все больше и больше ..
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)
{
}
}