如何将项目分为三层?

cho*_*obo 0 asp.net domain-driven-design data-access-layer organization n-tier-architecture

我有一个asp.net网站,我想把它组织成三层

  1. 数据访问
  2. UI

这些层中的具体内容是什么?

例如

数据 - 模型 - 存储库?这只是接口 - IoC吗?

域名 - 服务?

UI - javascript - 区域特定型号? - css

有人可以提供一个简单的指南来组织这样的asp.net网站吗?

小智 5

正如其他人所说的那样,每种情况都不同,但对于基本的架构,我可能会有类似的东西.它让我摆脱了一些堵塞,并且很快就能运行起来.

在此输入图像描述

基础设施层

这是完成所有数据访问的地方.数据库连接管理等.存储库包括对数据库的所有查询.依赖性解决方案也在这里.使用您选择的DI容器.

域层

这就是您所有业务逻辑的所在.域服务接口是UI层调用以使用业务逻辑的内容

UI

很明显这个......

代码示例

--ui

public class MyController
{
     private readonly IMySerivce _myService;
     public MyController(IMySerivce myService)
     {
         _mySerivce = myService;
     }
     public void MyAction()
     {
         _myService.DoSomeAction();
     }
}
Run Code Online (Sandbox Code Playgroud)

- 域

 public Interface IMyService()
 {
      void DoSomeAction();
 }
 public class MySerivce : IMyService()
 {
      private readonly IMyRepository _myRespository;
      public MySerivce(IMyRepository myRepository)
      {
           _myRepository = myRepository;
      }
      public void DoSomeAction()
      {
           _myRepository.Save();
      }
 }

 public interface IMyRepository
 {
     void Save();
 }
Run Code Online (Sandbox Code Playgroud)

--DataLayer

public MyRepository : IMyRepository
{
      public void Save()
      {
          //Manage Save here
      }
}
Run Code Online (Sandbox Code Playgroud)

另外,我通常有一个单独的区域用于单元/集成测试.

更新

这绝对取决于你的情况.如果没有完全理解你最终要构建的内容,很难说哪种方法最好.

从下面的列表中,您可以看到哪种方法适合您或适合您的架构.

无论您选择哪一个,您的存储库实现都必须依赖于您的Domain Objects项目.

这样做的一些技巧包括:

  • 没有映射

然后,您的域对象真正成为表的虚拟映射.即在数据库中有一个表调用User.然后有一个名为User的域对象.这是迄今为止最简单的技术.

在此输入图像描述

- 域

public class User
{
    public int Id {get; set;}
    public string UserName {get; set;}
    public string FirstName {get; set;}
    public string LastName {get; set;}
    public string Password {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

--Infrastructure

public class UserRepository : IUserRepository
{
     public Core.User GetById(int id)
     {
          return DBConnection.GetByIdQuery(id);
     }
}
Run Code Online (Sandbox Code Playgroud)
  • 制图

Martin Fowler 在这里描述了它

您的基础架构层中可以使用代表数据库表的域传输对象(DTO).与上面类似,一个名为User的表,一个名为User的DTO.两者都具有相同的属性.

然后,您的域实体将成为您的域和业务逻辑的真实表示.可以在存储库中完成DTO到您的域实体(搜索查询)的映射,并且您的域实体到DTO(保存/更新查询)的映射也将在您的存储库中完成.

要进行映射,您可以创建自定义映射类或使用AutoMapper等第三方工具.我是AutoMapper的忠实粉丝.

示例代码示例如下:

- 自定义映射器

public class UserRepository : IUserRepository
{
    private readonly IUserMapper _userMapper;
    public UserRepository(IUserMapper userMapper)
    {
         _userMapper = userMapper;
    }
    public Domain.User GetUserById(int id)
    {
         var DtoUser = GetUserByIdQuery(int id);
         return _userMapper.MapUserDTOToDomainEntity(DtoUser);
    }
}
public class UserMapper : IUserMapper
{
     public Domain.User MapUserDTOToDomainEntity(DataEntity.User dtoUser)
     {
          //Manual property mapping
     }
}
Run Code Online (Sandbox Code Playgroud)

--AutoMapper示例

public class UserRepository : IUserRepository
{
    public Domain.User GetUserById(int id)
    {
         var DtoUser = GetUserByIdQuery(int id);
         return Mapper.Map<Domain.User>(DtoUser);
    }
}
Run Code Online (Sandbox Code Playgroud)

其他例子包括:

/sf/ask/1030722871/

有很多很多的争论赫然出现在博客和这里DTO的,这样对价值,包括MSDN,这个博客和这些/sf/ask/786656251/,/sf/ask/1060420651/