Я изучаю C# в течение последнего года или около того и пытаюсь внедрить лучшие практики на этом пути. Между StackOverflow и другими веб-ресурсами я думал, что нахожусь на правильном пути, чтобы правильно разделить свои проблемы, но теперь у меня есть некоторые сомнения, и я хочу убедиться, что иду по правильному пути, прежде чем преобразовать весь свой веб-сайт в этот новый архитектура.
Текущий веб-сайт представляет собой старый ASP VBscript и имеет существующую базу данных, которая довольно уродлива (без внешних ключей и тому подобного), поэтому, по крайней мере, для первой версии в .NET я не хочу использовать и должен изучать какие-либо инструменты ORM в настоящее время.
У меня есть следующие элементы, которые находятся в отдельных пространствах имен и настроены так, что уровень пользовательского интерфейса может видеть только DTO и бизнес-уровни, а уровень данных можно увидеть только на бизнес-уровне. Вот простой пример:
productDTO.cs
public class ProductDTO
{
public int ProductId { get; set; }
public string Name { get; set; }
public ProductDTO()
{
ProductId = 0;
Name = String.Empty;
}
}
productBLL.cs
public class ProductBLL
{
public ProductDTO GetProductByProductId(int productId)
{
//validate the input
return ProductDAL.GetProductByProductId(productId);
}
public List<ProductDTO> GetAllProducts()
{
return ProductDAL.GetAllProducts();
}
public void Save(ProductDTO dto)
{
ProductDAL.Save(dto);
}
public bool IsValidProductId(int productId)
{
//domain validation stuff here
}
}
productDAL.cs
public class ProductDAL
{
//have some basic methods here to convert sqldatareaders to dtos
public static ProductDTO GetProductByProductId(int productId)
{
ProductDTO dto = new ProductDTO();
//db logic here using common functions
return dto;
}
public static List<ProductDTO> GetAllProducts()
{
List<ProductDTO> dtoList = new List<ProductDTO>();
//db logic here using common functions
return dtoList;
}
public static void Save(ProductDTO dto)
{
//save stuff here
}
}
В моем пользовательском интерфейсе я бы сделал что-то вроде этого:
ProductBLL productBll = new ProductBLL();
List<ProductDTO> productList = productBll.GetAllProducts();
для сохранения:
ProductDTO dto = new ProductDTO();
dto.ProductId = 5;
dto.Name = "New product name";
productBll.Save(dto);
Я совсем не в теме? Должен ли я также иметь те же свойства в моем BLL и не передавать DTO обратно в мой пользовательский интерфейс? Подскажите, пожалуйста, что не так, а что правильно. Имейте в виду, что я еще не эксперт.
Я хотел бы реализовать интерфейсы для своей архитектуры, но я все еще учусь, как это делать.