这是 n 层架构的正确实现吗?

2024-03-11

我在过去一年左右的时间里一直在学习 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
    }

}

在我的用户界面中,我会做这样的事情:

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?请告诉我什么是错的,什么是对的。请记住,我还不是专家。

我想为我的架构实现接口,但我仍在学习如何做到这一点。


凯德有一个很好的解释。为了避免贫血领域模型,您可以考虑做一些事情:

  • 使 DTO 对象成为您的域对象(只需将其称为“产品”)
  • IsValidProductId 可以在 Product 上,当调用 setter 时,您可以验证它是否有效,如果无效则抛出异常
  • 实施某种有关名称的规则
  • 如果还有任何其他对象与 Product 交互,我们可以讨论更多有趣的事情
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

这是 n 层架构的正确实现吗? 的相关文章

随机推荐