Я работаю над новым проектом под типичной трехслойной архитектурой: 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>();
}
И UnitOfWork:
private GenericRepository<User> userRepository;
public GenericRepository<User> UserRepository
{
get
{
if (this.userRepository== null)
{
this.userRepository= new GenericRepository<User>(context);
}
return userRepository;
}
}
Большинство структур будут одинаковыми, за исключением некоторых конкретных случаев контроллеров, которые нужно будет сделать вручную.