去年左右我一直在学习 C#,并尝试在此过程中整合最佳实践。在 StackOverflow 和其他网络资源之间,我认为我在正确分离我的关注点方面处于正确的轨道上,但现在我有一些疑问,并想确保在我将整个网站转换到这个新网站之前我走的是正确的道路建筑学。
当前的网站是旧的 ASP VBscript,并且现有的数据库非常丑陋(没有外键等),因此至少对于 .NET 中的第一个版本,我不想使用并且必须学习任何 ORM 工具。
我有以下项目,它们位于单独的命名空间和设置中,因此 UI 层只能看到 DTO 和业务层,而数据层只能从业务层看到。这是一个简单的例子:
产品DTO.cs
public class ProductDTO
{
public int ProductId { get; set; }
public string Name { get; set; }
public ProductDTO()
{
ProductId = 0;
Name = String.Empty;
}
}
产品BLL.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
}
}
产品DAL.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
}
}
在我的 UI 中,我会做这样的事情:
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 传递回我的 UI?请告诉我什么是错的,什么是对的。请记住,我还不是专家。
我想为我的架构实现接口,但我仍在学习如何做到这一点。