首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将项目组织成三层?

如何将项目组织成三层?
EN

Stack Overflow用户
提问于 2013-12-11 17:15:16
回答 1查看 828关注 0票数 0

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

  1. DataAccess
  2. 域名
  3. 用户界面

这些层中的每一层都有哪些具体的内容?

e.g

数据模型-存储库?那仅仅是接口- IoC吗?

域名-服务?

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-11 17:43:28

正如其他人所说,每一种情况都是不同的,但对于基本的架构,我可能会同意这样的做法。它让我摆脱了几个堵塞,很快就起来了。

基础结构层

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

域层

这就是你所有业务逻辑所处的位置。域服务接口是UI层调用的,以使用您的业务逻辑

用户界面

很明显这个..。

代码示例

-UI

代码语言:javascript
复制
public class MyController
{
     private readonly IMySerivce _myService;
     public MyController(IMySerivce myService)
     {
         _mySerivce = myService;
     }
     public void MyAction()
     {
         _myService.DoSomeAction();
     }
}

-领域

代码语言:javascript
复制
 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();
 }

-DataLayer

代码语言:javascript
复制
public MyRepository : IMyRepository
{
      public void Save()
      {
          //Manage Save here
      }
}

此外,我通常有一个单独的单元/集成测试区域。

更新

这绝对取决于你的处境。如果不完全理解您最终想要构建的是什么,那么很难说什么方法是最好的。

从下面的列表中,您可以看到哪种方法适合您,或者非常适合您的体系结构。

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

这样做的一些技巧包括:

  • 无映射

您的域对象实际上变成了到表的虚拟映射。也就是说,在数据库调用用户中有一个表。然后有一个名为User的域对象。这是迄今为止最简单的技术。

-领域

代码语言:javascript
复制
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;}
}

-基础设施

代码语言:javascript
复制
public class UserRepository : IUserRepository
{
     public Core.User GetById(int id)
     {
          return DBConnection.GetByIdQuery(id);
     }
}
  • 映射

Martin描述它为这里

在基础结构层中,有可能拥有表示数据库表的域传输对象(,DTO)。与上面类似,表名为User,DTO称为User。都有相同的属性。

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

要进行映射,您可以创建自定义映射类,也可以使用第三方工具(如AutoMapper )。我是AutoMapper的超级粉丝。

一个示例代码示例如下所示:

-定制映射器

代码语言:javascript
复制
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
     }
}

-AutoMapper示例

代码语言:javascript
复制
public class UserRepository : IUserRepository
{
    public Domain.User GetUserById(int id)
    {
         var DtoUser = GetUserByIdQuery(int id);
         return Mapper.Map<Domain.User>(DtoUser);
    }
}

其他例子包括:

https://stackoverflow.com/questions/14724612

在博客中有很多关于DTO的价值的争论,包括MSDN,this 博客https://stackoverflow.com/questions/11237946https://stackoverflow.com/questions/15148866

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20525637

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档