【发布时间】:2011-07-06 01:11:24
【问题描述】:
在过去一年左右的时间里,我一直在学习 C#,并尝试在此过程中整合最佳实践。在 StackOverflow 和其他网络资源之间,我认为我在正确分离我的关注点方面处于正确的轨道上,但现在我有一些疑问,并想确保在我将整个网站转换到这个新网站之前我走的是正确的道路架构。
当前的网站是旧的 ASP VBscript 并且有一个非常丑陋的现有数据库(没有外键等)所以至少对于 .NET 的第一个版本我不想使用并且必须学习任何 ORM 工具这次。
我有以下项目在单独的命名空间和设置中,以便 UI 层只能看到 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
}
}
在我的 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?请告诉我什么是错的,什么是对的。请记住,我还不是专家。
我想为我的架构实现接口,但我仍在学习如何做到这一点。
【问题讨论】:
-
在我的工作中,我们维护了一个具有惊人相似架构的项目,并且知道我现在所知道的,我会尝试吸收它并使用 ORM(我喜欢 NHibernate)。我可能有偏见,但是当你开始像这样构建你的架构时,你开始拥有只将信息传递到下一层的类。 NHibernate 有非常好的查询 API,它们会给你带来很多好处,而且没有规定说你必须拥有外键才能使用 NHibernate(尽管它们显然很有帮助)。
-
在我没有真正掌握 c#/ASP.net 的情况下尝试学习 NHibernate 比我现在想要的要多一点。另外,数据库表名和字段名都是全面的。感谢您的评论。
标签: c# asp.net architecture anemic-domain-model