【发布时间】:2018-05-15 07:57:15
【问题描述】:
我正在一个典型的三层架构下的新项目中工作:business、data 和 client,使用 Angular 作为前端。
在这个项目中,我们将有一个我们想要自动化的重复性任务:创建 CRUD。 我们要做的是从实体及其属性生成模型和控制器(put、get、post、delete)以及其他基本项目信息。
我最好的选择是什么?我曾考虑过模板 T4,但我对它们的无知让我怀疑它是否是最佳选择。
例如,来自这个实体:
public class User
{
public int Id { get; set; }
public string Name {get;set;}
public string Email{ get; set; }
public IEnumerable<Task> Task { get; set; }
}
我要生成如下模型:
public class UserModel
{
public int Id { get; set; }
public string Name {get;set;}
public string Email{ get; set; }
public IEnumerable<Task> Task { get; set; }
}
还有控制器:
{
/// <summary>
/// User controller
/// </summary>
[Route("api/[controller]")]
public class UserController: Controller
{
private readonly LocalDBContext localDBContext;
private UnitOfWork unitOfWork;
/// <summary>
/// Constructor
/// </summary>
public UserController(LocalDBContext localDBContext)
{
this.localDBContext = localDBContext;
this.unitOfWork = new UnitOfWork(localDBContext);
}
/// <summary>
/// Get user by Id
/// </summary>
[HttpGet("{id}")]
[Produces("application/json", Type = typeof(UserModel))]
public IActionResult GetById(int id)
{
var user = unitOfWork.UserRepository.GetById(id);
if (user == null)
{
return NotFound();
}
var res = AutoMapper.Mapper.Map<UserModel>(user);
return Ok(res);
}
/// <summary>
/// Post an user
/// </summary>
[HttpPost]
public IActionResult Post([FromBody]UserModel user)
{
Usuario u = AutoMapper.Mapper.Map<User>(user);
var res = unitOfWork.UserRepository.Add(u);
if (res?.Id > 0)
{
return Ok(res);
}
return BadRequest();
}
/// <summary>
/// Edit an user
/// </summary>
[HttpPut]
public IActionResult Put([FromBody]UserModel user)
{
if (unitOfWork.UserRepository.GetById(user.Id) == null)
{
return NotFound();
}
var u = AutoMapper.Mapper.Map<User>(user);
var res = unitOfWork.UserRepository.Update(u);
return Ok(res);
}
/// <summary>
/// Delete an user
/// </summary>
[HttpDelete("{id}")]
public IActionResult Delete(int id)
{
if (unitOfWork.UserRepository.GetById(id) == null)
{
return NotFound();
}
unitOfWork.UserRepository.Delete(id);
return Ok();
}
另外,我们需要添加AutoMapper 映射:
public AutoMapper()
{
CreateMap<UserModel, User>();
CreateMap<User, UserModel>();
}
还有工作单元:
private GenericRepository<User> userRepository;
public GenericRepository<User> UserRepository
{
get
{
if (this.userRepository== null)
{
this.userRepository= new GenericRepository<User>(context);
}
return userRepository;
}
}
大部分结构都将是相同的,除了一些必须手动完成的特定情况的控制器。
【问题讨论】:
-
您可以通过以下方式轻松做到这一点->c-sharpcorner.com/article/scaffolding-asp-net-core-mvc
-
如果我没记错的话,这不允许我添加映射、上下文和招摇注解。此外,架构不会让我们以这种方式工作,因为我们没有为每个实体创建一个 dbset,我们使用的是泛型。
-
好吧,如果您找不到现成的解决方案 - 我认为 T4 是可行的方法。
-
google for 脚手架 - 他们如何称呼这种方法。作为 T4 的替代方案,您可以尝试创建控制台应用程序项目并使用 Roslyn API 生成代码。它非常好,你可以用它做一些非常高级的事情,但它比 T4 更难阅读。我已经通过这种方式从 XML 模式生成了一些自定义 C# 代码,并且效果很好。
-
这个项目可能是一个有用的起点,github.com/amelmusic/REST-Framework