cho*_*obo 0 asp.net domain-driven-design data-access-layer organization n-tier-architecture
我有一个asp.net网站,我想把它组织成三层
这些层中的具体内容是什么?
例如
数据 - 模型 - 存储库?这只是接口 - IoC吗?
域名 - 服务?
UI - javascript - 区域特定型号? - css
有人可以提供一个简单的指南来组织这样的asp.net网站吗?
小智 5
正如其他人所说的那样,每种情况都不同,但对于基本的架构,我可能会有类似的东西.它让我摆脱了一些堵塞,并且很快就能运行起来.

这是完成所有数据访问的地方.数据库连接管理等.存储库包括对数据库的所有查询.依赖性解决方案也在这里.使用您选择的DI容器.
这就是您所有业务逻辑的所在.域服务接口是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)
其他例子包括:
有很多很多的争论赫然出现在博客和这里DTO的,这样对价值,包括MSDN,这个博客和这些/sf/ask/786656251/,/sf/ask/1060420651/
| 归档时间: |
|
| 查看次数: |
659 次 |
| 最近记录: |