我认为你只是在定义每个层次的内容和在你的解决方案中所扮演的角色方面有一些问题。
数据层
您的数据层仅仅是指您的数据库/SharePoint列表/.csv文件/Excel表格等存储数据的地方,可以采用任何格式。因此请记住,数据层只不过是数据而已。
数据访问层
该层抽象了您的数据源,并提供了一个API,使应用程序的其余部分可以与数据源交互。
假设我们的数据源是MS SQL数据库,并且我们正在使用Entity Framework访问数据。您将尝试抽象掉的是数据库和Entity Framework,并为每个实体创建一个数据仓库
。
例如...
我们在MS SQL数据库中有一个Customers
表。客户表中的每个客户都是一个实体
,并在您的C#代码中表示为这样。
通过使用存储库模式,我们可以抽象出数据访问代码的实现,因此,如果将来我们的数据源发生更改,则不会影响我们应用程序的其余部分。接下来,我们需要在数据访问层
中添加一个CustomersRepository
,其中包括Add
、Remove
和FindById
等方法,以抽象出任何数据访问代码。以下示例展示了如何实现此目标。
public interface IEntity
{
int Id { get; set; }
}
public class Customer : IEntity
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime RegistrationDate { get; set; }
}
public interface IRepository<TEntity> where TEntity : class, IEntity
{
TEntity FindById(int id);
void Add(TEntity entity);
void Remove(TEntity entity);
}
public class CustomerRepository : IRepository<Customer>
{
public Customer FindById(int id)
{
return null;
}
public void Add(Customer customer)
{
}
public void Remove(Customer customer)
{
}
}
数据访问层位于数据层和业务逻辑之间。
业务层
业务层建立在数据访问层之上,不涉及任何数据访问问题,而是专门处理业务逻辑。如果其中一个业务要求是防止从英国以外的地方下订单,则业务逻辑层将处理此问题。
表现层
表现层仅呈现数据,但如果您不小心呈现数据并允许发布哪些数据,则会为自己带来很多麻烦,这就是为什么使用视图模型非常重要,因为视图模型是表现层关注的内容,表现层不需要了解您的域模型,它只需要知道视图模型的相关信息。
那么什么是视图模型呢?它们只是为每个视图量身定制的数据模型,例如注册表单将包括一个RegistrationViewModel
,公开这些典型属性。
public class RegistrationViewModel
{
public string Email { get; set; }
public string Password { get; set; }
public string ConfirmPassword { get; set; }
}
演示层也处理输入验证,例如验证键入的电子邮件地址是否具有正确的格式,或输入的密码是否匹配是演示层的问题,而不是业务问题,并且可以使用Data Annotations
来处理。
public class RegistrationViewModel
{
[Required]
[DataType(DataType.EmailAddress)]
public string Email { get; set; }
[Required]
[DataType(DataType.Password)]
[Compare("ConfirmPassword")
public string Password { get; set; }
[Required]
[DataType(DataType.Password)]
public string ConfirmPassword { get; set; }
}
使用View Models的原因在于Business Models属于业务层,其中包含应保持私有的数据。例如,如果您将Domain Model暴露在JSON响应中,它将会暴露用户的全部数据,包括他们的姓名和地址,因为您没有选择性地公开什么以及什么不公开,而是使用任何看起来有效的东西。
我还要指出,领域模型(domain models)和实体模型(entity models)之间存在区别。这里有一个更详细的答案:here
Cross cutting concerns
这里我简要介绍一下:
- 异常管理
- 将View Models映射到Domain Models。