Los comentarios XML se agregan arriba de funciones o propiedades de una clase para proporcionar la explicación de la función y sus parámetros. Cuando compilas tu aplicación todos los comentarios se guardan en un archivo XML.
Los comentarios XML utilizan 3 diagonales /// seguido de una etiqueta que indica el tipo de comentario.
Los tipos de etiquetas más comunes son:
Etiqueta
Descripción
<summary>
Aquí describimos brevemente la clase o servicio.
<remarks>
Aquí puedes describir las reglas de negocio o información importante para utilizar la clase o función
<returns>
Indicas lo que regresa la función. Por ejemplo para el método GET/Categorías indicas que regresa la lista de todas las categorías
<param name="nombre">
Describes para que es necesario el parámetro. Donde a es el nombre del parámetro que estas describiendo
<para>
Dentro de la etiqueta <remarks> o <summary> te permite separar el texto en párrafos
<value>
Indica que es lo que contiene una propiedad pública de una clase
<example>
Puedes escribir ejemplos de cómo se utiliza la función.
<code>
Aquí podemos incluir código de ejemplo
Puedes ver la documentación oficial y ejemplos aquí
Arriba del nombre de la clase agregamos /// automáticamente te agrega la etiqueta <summary>. Dentro de la etiqueta <summary> escribimos lo siguiente: Permite registrar las categorías de los productos que vende la empresa
Categoria.cs
/// <summary> /// Permite registrar las categorías de los productos /// que vende la empresa /// </summary>publicclassCategoria {
3. Comentamos cada propiedad del modelo. Tecleando /// arriba de cada atributo. Ejemplo:
Categoria.cs
/// <summary> /// Id de la categoria /// </summary> /// <value>El Id se incrementa automáticamente</value> [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)]publicint Id { get; set; }/// <summary>/// Obtiene o establece la clave de la categoría/// </summary>/// <value>La clave de la categoria</value>[Required(ErrorMessage ="Por favor teclea el campo Clave")][Range(1,999)]publicint Clave { get; set; }/// <summary>/// Obtiene o establece el nombre de la categoría/// </summary>/// <value>El nombre de la categoría</value>[Required(ErrorMessage ="Por favor teclea el campo Nombre")][Column(TypeName ="VARCHAR(80)")]publicstring Nombre { get; set; }
Comentando los servicios
Documentamos los servicios de la misma manera.
Dentro de la carpeta Controllers abrimos el archivo CategoriasController.cs
Arriba del nombre de la clase y de [Route("api/[controller]")] tecleamos /// y dentro de <summary> tecleamos Servicios para guardar, modificar o borrar las categorías de los productos
/// <summary>/// Servicios para guardar, modificar o borrar las categorías/// de los productos/// </summary>[Route("api/[controller]")][ApiController]publicclassCategoriasController:ControllerBase
3. Arriba de cada método tecleamos igual /// y comentamos el summary, los parámetros y en return especificamos que es lo que regresa el servicio de los servicios que cuentan con parámetros. Ejemplo:
CategoriasController.cs
/// <summary>/// Obtiene todas las categorías registradas/// </summary>/// <returns>Todas las categorías</returns>// GET: api/Categorias[HttpGet]publicIEnumerable<Categoria> GetCategoria()
Como el método obtener por Id regresa un action result si queremos documentar el objeto Categoría podemos agregar [ProducesResponseType(200, Type = typeof(Categoria))]
CategoriasController.cs
/// <summary>/// Obtiene una categoría de acuerdo a su Id/// </summary>/// <returns>Los datos de la categoría</returns>/// <paramname="id">Id de la categoría</param>// GET: api/Categorias/5[HttpGet("{id}")][ProducesResponseType(200, Type =typeof(Categoria))]publicasyncTask<IActionResult> GetCategoria([FromRoute] int id)
CategoriasController.cs
/// <summary>/// Modifica una categoría/// </summary>/// <returns>No Content si se modifico correctamente</returns>/// <paramname="id">Id de la categoría a Modificar</param>/// <paramname="categoria">Datos de la Categoria.</param>// PUT: api/Categorias/5[HttpPut("{id}")]publicasyncTask<IActionResult> PutCategoria([FromRoute] int id, [FromBody] Categoria categoria)
CategoriasController.cs
/// <summary>/// Permite registrar una nueva categoría de productos/// </summary>/// <returns>Los datos de la categoría agregada</returns>/// <paramname="categoria">Datos de la categoría</param>// POST: api/Categorias[HttpPost]publicasyncTask<IActionResult> PostCategoria( [FromBody] Categoria categoria)
CategoriasController.cs
/// <summary>/// Permite borrar una categoría/// </summary>/// <returns>Los datos de la categoría eliminada</returns>/// <paramname="id">Id de la categoría a borrar</param>// DELETE: api/Categorias/5[HttpDelete("{id}")]publicasyncTask<IActionResult> DeleteCategoria([FromRoute] int id)
Aqui esta el código final
CategoriasController.cs
usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Threading.Tasks;usingMicrosoft.AspNetCore.Mvc;usingMicrosoft.EntityFrameworkCore;usingCaducaRest.Models;usingCaducaRest.DAO;namespaceCaducaRest.Controllers{ /// <summary> /// Servicios para guardar, modificar o borrar las categorías de los productos /// </summary> [Route("api/[controller]")] [ApiController]publicclassCategoriasController:ControllerBase {privatereadonlyCaducaContext _context;privateCategoriaDAO categoriaDAO;publicCategoriasController(CaducaContext context) { _context = context; categoriaDAO =newCategoriaDAO(_context); } /// <summary> /// Obtiene todas las categorías registradas /// </summary> /// <returns>Todas las categorías</returns> // GET: api/Categorias [HttpGet]publicasyncTask<IEnumerable<Categoria>> GetCategoriaAsync() { returnawaitcategoriaDAO.ObtenerTodoAsync(); } /// <summary> /// Obtiene una categoría de acuerdo a su Id /// </summary> /// <returns>Los datos de la categoría</returns> /// <paramname="id">Id de la categoría</param> // GET: api/Categorias/5 [HttpGet("{id}")]publicasyncTask<IActionResult> GetCategoria([FromRoute] int id) {if (!ModelState.IsValid) {returnBadRequest(ModelState); }var categoria =awaitcategoriaDAO.ObtenerPorIdAsync(id);if (categoria ==null) {returnNotFound(); }returnOk(categoria); } /// <summary> /// Modifica una categoría /// </summary> /// <returns>No Content si se modifico correctamente</returns> /// <paramname="id">Id de la categoría a Modificar</param> /// <paramname="categoria">Datos de la Categoria.</param> // PUT: api/Categorias/5 [HttpPut("{id}")]publicasyncTask<IActionResult> PutCategoria([FromRoute] int id, [FromBody] Categoria categoria) {if (!ModelState.IsValid) {returnBadRequest(ModelState); }if (id !=categoria.Id) {returnBadRequest(); }_context.Entry(categoria).State=EntityState.Modified;try {await_context.SaveChangesAsync(); }catch (DbUpdateConcurrencyException) {if (!CategoriaExists(id)) {returnNotFound(); }else {throw; } }returnNoContent(); } /// <summary> /// Permite registrar una nueva categoría de productos /// </summary> /// <returns>Los datos de la categoría agregada</returns> /// <paramname="categoria">Datos de la categoría</param> // POST: api/Categorias [HttpPost]publicasyncTask<IActionResult> PostCategoria([FromBody] Categoria categoria) {if (!ModelState.IsValid) {returnBadRequest(ModelState); }_context.Categoria.Add(categoria);await_context.SaveChangesAsync();returnCreatedAtAction("GetCategoria",new { id =categoria.Id }, categoria); } /// <summary> /// Permite borrar una categoría /// </summary> /// <returns>Los datos de la categoría eliminada</returns> /// <paramname="id">Id de la categoría a borrar</param> // DELETE: api/Categorias/5 [HttpDelete("{id}")]publicasyncTask<IActionResult> DeleteCategoria([FromRoute] int id) {if (!ModelState.IsValid) {returnBadRequest(ModelState); }var categoria =await_context.Categoria.FindAsync(id);if (categoria ==null) {returnNotFound(); }_context.Categoria.Remove(categoria);await_context.SaveChangesAsync();returnOk(categoria); }privateboolCategoriaExists(int id) {return_context.Categoria.Any(e =>e.Id== id); } }}