You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
<p>La arquitectura en este demo está organizada en proyectos de C# independientes[^2], donde cada proyecto corresponde a un círculo:</p>
174
174
<p>[^2]: En la <ahref="https://learn.microsoft.com/en-us/dotnet/architecture/modern-web-apps-azure/common-web-application-architectures">documentación de Microsoft sobre Clean Architecture</a> el círculo central es <spanclass="tt">Application Core</span> e incluye lo que en la documentación original de <ahref="https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html">Clean Architecture</a> son los círculos <spanclass="tt">Entities</span> y <spanclass="tt">Use Cases</span>. A pesar de ser una demo en .NET, usamos la terminología original.</p>
175
175
<oltype="1">
176
-
<li><ahref="./html/namespaceTaskManagement_1_1Domain.html">TaskManagement.Domain</a> es una librería de C# en la que se define el <ahref="https://github.com/ucudal/ANDIS_Conceptos/blob/main/4_Conceptos/4_Dominio.md">dominio</a> de la aplicación: <ahref="https://github.com/ucudal/ANDIS_Conceptos/blob/main/2_Tecnicas_y_herramientas/2_08_.Patrones_de_diseno/2_08_Entity.md">entidades</a> y <ahref="https://github.com/ucudal/ANDIS_Conceptos/blob/main/2_Tecnicas_y_herramientas/2_08_.Patrones_de_diseno/2_08_Value_Object.md">objetos valor</a>, eventos y excepciones. El domino utiliza <ahref="../src/TaskManagement.Domain/Events/DomainEvent.cs">eventos</a> para informar cuando se crea, se completa, o se asigna una tarea, o cuando cambia su prioridad —ver por ejemplo la propiedad <spanclass="tt">TaskItem.DomainEvents</span> y el método <spanclass="tt">TaskItem.Create</span> en <ahref="../src/TaskManagement.Domain/Entities/TaskItem.cs">TaskItem.cs</a>—; por esto, esta aplicación también utiliza una <ahref="https://github.com/ucudal/ANDIS_Conceptos/blob/main/3_Plantillas/3_13_Event_Driven_Architecture.md">arquitectura dirigida por eventos</a>. La capa de dominio tiene la responsabilidad de generar eventos, pero es la capa de aplicación la que tienen la responsabilidad de procesarlos —ver por ejemplo <spanclass="tt">CreateTaskCommand.Handle</span> en <ahref="../src/TaskManagement.Application/Commands/CreateTaskCommand.cs">CreateTaskCommand.cs</a>—. El proyecto <ahref="../src/TaskManagement.Domain/TaskManagement.Domain.csproj"><spanclass="tt">TaskManagement.Domain</span></a> no referencia ningún otro proyecto, es el centro de los círculos concéntricos.</li>
177
-
<li><ahref="./html/namespaceTaskManagement_1_1Application.html">TaskManagement.Application</a> es otra librería de C# en la que se definen las funcionalidades de la aplicación —comandos y consultas—, o dicho de otra forma, donde se implementa la lógica de los casos de uso. Esta aplicación usa el patrón <ahref="https://github.com/ucudal/ANDIS_Conceptos/blob/main/2_Tecnicas_y_herramientas/2_09_.Patrones_de_arquitectura/2_09_CQRS.md">CQRS</a> donde los comandos están separados de las consultas —ver por ejemplo la clase <spanclass="tt">CreateTaskCommand</span> en <ahref="../src/TaskManagement.Application/Commands/CreateTaskCommand.cs">CreateTaskCommand.cs</a> y la clase <spanclass="tt">GetTaskBuyIdQuery</span> en <ahref="../src/TaskManagement.Application/Queries/GetTaskByIdQuery.cs">GetTaskByIdQuery.cs</a>—. La capa de aplicación define —y utiliza— abstracciones que emplean el patrón de <ahref="https://learn.microsoft.com/en-us/dotnet/core/extensions/dependency-injection/overview">inyección de dependencias</a> —ver por ejemplo las interfaces <spanclass="tt">IEmailService</span> en <ahref="../src/TaskManagement.Application/Interfaces/IEmailService.cs">IEmailService.cs</a>, <spanclass="tt">ITaskRepository</span> en <ahref="../src/TaskManagement.Application/Interfaces/ITaskRepository.cs">ITaskRepository.cs</a>, <spanclass="tt">ITaskReadRepository</span> en <ahref="../src/TaskManagement.Application/Interfaces/ITaskReadRepository.cs">ITaskReadRepository.cs</a> o <spanclass="tt">IUnitOfWork</span> en <ahref="../src/TaskManagement.Application/Interfaces/IUnitOfWork.cs">IUnitOfWork.cs</a>—[^3]. Las clases concretas que implementan estas abstracciones están definidas en la capa de infraestructura —ver por ejemplo las clases <spanclass="tt">TaskRepository</span> y <spanclass="tt">TaskReadRepository</span> en <ahref="../src/TaskManagement.Infrastructure/Persistence/Repositories/TaskRepository.cs">TaskRepository.cs</a><ahref="../src/TaskManagement.Infrastructure/Persistence/Repositories/TaskReadRepository.cs">TaskReadRepository.cs</a>, respectivamente— y también son creadas en tiempo de ejecución en la capa de interfaz API —ver las llamadas a <spanclass="tt">builder.services…
176
+
<li><ahref="./namespaceTaskManagement_1_1Domain.html">TaskManagement.Domain</a> es una librería de C# en la que se define el <ahref="https://github.com/ucudal/ANDIS_Conceptos/blob/main/4_Conceptos/4_Dominio.md">dominio</a> de la aplicación: <ahref="https://github.com/ucudal/ANDIS_Conceptos/blob/main/2_Tecnicas_y_herramientas/2_08_.Patrones_de_diseno/2_08_Entity.md">entidades</a> y <ahref="https://github.com/ucudal/ANDIS_Conceptos/blob/main/2_Tecnicas_y_herramientas/2_08_.Patrones_de_diseno/2_08_Value_Object.md">objetos valor</a>, eventos y excepciones. El domino utiliza <ahref="../src/TaskManagement.Domain/Events/DomainEvent.cs">eventos</a> para informar cuando se crea, se completa, o se asigna una tarea, o cuando cambia su prioridad —ver por ejemplo la propiedad <spanclass="tt">TaskItem.DomainEvents</span> y el método <spanclass="tt">TaskItem.Create</span> en <ahref="../src/TaskManagement.Domain/Entities/TaskItem.cs">TaskItem.cs</a>—; por esto, esta aplicación también utiliza una <ahref="https://github.com/ucudal/ANDIS_Conceptos/blob/main/3_Plantillas/3_13_Event_Driven_Architecture.md">arquitectura dirigida por eventos</a>. La capa de dominio tiene la responsabilidad de generar eventos, pero es la capa de aplicación la que tienen la responsabilidad de procesarlos —ver por ejemplo <spanclass="tt">CreateTaskCommand.Handle</span> en <ahref="../src/TaskManagement.Application/Commands/CreateTaskCommand.cs">CreateTaskCommand.cs</a>—. El proyecto <ahref="../src/TaskManagement.Domain/TaskManagement.Domain.csproj"><spanclass="tt">TaskManagement.Domain</span></a> no referencia ningún otro proyecto, es el centro de los círculos concéntricos.</li>
177
+
<li><ahref="./namespaceTaskManagement_1_1Application.html">TaskManagement.Application</a> es otra librería de C# en la que se definen las funcionalidades de la aplicación —comandos y consultas—, o dicho de otra forma, donde se implementa la lógica de los casos de uso. Esta aplicación usa el patrón <ahref="https://github.com/ucudal/ANDIS_Conceptos/blob/main/2_Tecnicas_y_herramientas/2_09_.Patrones_de_arquitectura/2_09_CQRS.md">CQRS</a> donde los comandos están separados de las consultas —ver por ejemplo la clase <spanclass="tt">CreateTaskCommand</span> en <ahref="../src/TaskManagement.Application/Commands/CreateTaskCommand.cs">CreateTaskCommand.cs</a> y la clase <spanclass="tt">GetTaskBuyIdQuery</span> en <ahref="../src/TaskManagement.Application/Queries/GetTaskByIdQuery.cs">GetTaskByIdQuery.cs</a>—. La capa de aplicación define —y utiliza— abstracciones que emplean el patrón de <ahref="https://learn.microsoft.com/en-us/dotnet/core/extensions/dependency-injection/overview">inyección de dependencias</a> —ver por ejemplo las interfaces <spanclass="tt">IEmailService</span> en <ahref="../src/TaskManagement.Application/Interfaces/IEmailService.cs">IEmailService.cs</a>, <spanclass="tt">ITaskRepository</span> en <ahref="../src/TaskManagement.Application/Interfaces/ITaskRepository.cs">ITaskRepository.cs</a>, <spanclass="tt">ITaskReadRepository</span> en <ahref="../src/TaskManagement.Application/Interfaces/ITaskReadRepository.cs">ITaskReadRepository.cs</a> o <spanclass="tt">IUnitOfWork</span> en <ahref="../src/TaskManagement.Application/Interfaces/IUnitOfWork.cs">IUnitOfWork.cs</a>—[^3]. Las clases concretas que implementan estas abstracciones están definidas en la capa de infraestructura —ver por ejemplo las clases <spanclass="tt">TaskRepository</span> y <spanclass="tt">TaskReadRepository</span> en <ahref="../src/TaskManagement.Infrastructure/Persistence/Repositories/TaskRepository.cs">TaskRepository.cs</a><ahref="../src/TaskManagement.Infrastructure/Persistence/Repositories/TaskReadRepository.cs">TaskReadRepository.cs</a>, respectivamente— y también son creadas en tiempo de ejecución en la capa de interfaz API —ver las llamadas a <spanclass="tt">builder.services…
TaskReadRepository>(), y .AddScoped<IDomainEventDispatcher,
180
180
MediatRDomainEventDispatcher>()</span> en <ahref="../src/TaskManagement.API/Program.cs">Program.cs</a>—. Los eventos creados en la capa de dominio son procesados en la capa de aplicación usando una abstracción —ver la interfaz <spanclass="tt">IDomainEventDispatcher</span> en <ahref="../src/TaskManagement.Application/Interfaces/IDomainEventDispatcher.cs">IDomainEventDispatcher.cs</a>—; y esa abstracción también está implementada en una clase definida en la capa de infraestructura —ver la clase <spanclass="tt">MediatRDomainEventDispatcher</span> en <ahref="../src/TaskManagement.Infrastructure/EventDispatching/MediatRDomainEventDispatcher.cs">MediatRDomainEventDispatcher.cs</a>—. El proyecto <ahref="../src/TaskManagement.Application/TaskManagement.Application.csproj"><spanclass="tt">TaskManagement.Application</span></a> referencia solamente el proyecto <ahref="../src/TaskManagement.Domain/TaskManagement.Domain.csproj"><spanclass="tt">TaskManagement.Domain</span></a>, la dependencia es de un círculo externo al centro de los círculos concéntricos.</li>
181
-
<li><ahref="./html/namespaceTaskManagement_1_1Infrastructure.html">TaskManagement.Infrastructure</a> es otra librería de C# en la que se definen cómo se implementa la infraestructura para las abstracciones definidas en la capa de aplicación de —repositorios, despacho de eventos y persistencia—. Las abstracciones <ahref="../src/TaskManagement.Application/Interfaces/ITaskRepository.cs"><spanclass="tt">ITaskRepository</span></a> y <ahref="../src/TaskManagement.Application/Interfaces/ITaskReadRepository.cs"><spanclass="tt">ITaskReadRepository</span></a> de la capa de aplicación se implementan con las clases <ahref="../src/TaskManagement.Infrastructure/Persistence/Repositories/TaskRepository.cs"><spanclass="tt">TaskRepository</span></a> y <ahref="../src/TaskManagement.Infrastructure/Persistence/Repositories/TaskReadRepository.cs"><spanclass="tt">TaskReadRepository</span></a>, respectivamente, de esta capa de infraestructura. También en este caso se usa injección de dependencias en la capa de interfaz API —ver por ejemplo en <ahref="../src/TaskManagement.API/Program.cs"><spanclass="tt">Program</span></a> las llamadas a <spanclass="tt">builder.services...AddScoped<ITaskRepository, TaskRepository>()</span> y <spanclass="tt">builder.services...AddScoped<ITaskReadRepository, TaskReadRepository>()</span>—. Como ya fue mencionado antes, la abstracción <ahref="../src/TaskManagement.Application/Interfaces/IDomainEventDispatcher.cs"><spanclass="tt">IDomainEventDispatcher</span></a> definida en la capa de aplicación se implementa con la clase <ahref="../src/TaskManagement.Infrastructure/EventDispatching/MediatRDomainEventDispatcher.cs"><spanclass="tt">MediatRDomainEventDispatcher</span></a> de esta capa de infraestructura y la instancia se crea en tiempo de ejecución también con injección de dependencias en la capa de interfaz API en <ahref="../src/TaskManagement.API/Program.cs"><spanclass="tt">Program</span></a> —ver <spanclass="tt">builder.services...AddScoped<IDomainEventDispatcher,
181
+
<li><ahref="./namespaceTaskManagement_1_1Infrastructure.html">TaskManagement.Infrastructure</a> es otra librería de C# en la que se definen cómo se implementa la infraestructura para las abstracciones definidas en la capa de aplicación de —repositorios, despacho de eventos y persistencia—. Las abstracciones <ahref="../src/TaskManagement.Application/Interfaces/ITaskRepository.cs"><spanclass="tt">ITaskRepository</span></a> y <ahref="../src/TaskManagement.Application/Interfaces/ITaskReadRepository.cs"><spanclass="tt">ITaskReadRepository</span></a> de la capa de aplicación se implementan con las clases <ahref="../src/TaskManagement.Infrastructure/Persistence/Repositories/TaskRepository.cs"><spanclass="tt">TaskRepository</span></a> y <ahref="../src/TaskManagement.Infrastructure/Persistence/Repositories/TaskReadRepository.cs"><spanclass="tt">TaskReadRepository</span></a>, respectivamente, de esta capa de infraestructura. También en este caso se usa injección de dependencias en la capa de interfaz API —ver por ejemplo en <ahref="../src/TaskManagement.API/Program.cs"><spanclass="tt">Program</span></a> las llamadas a <spanclass="tt">builder.services...AddScoped<ITaskRepository, TaskRepository>()</span> y <spanclass="tt">builder.services...AddScoped<ITaskReadRepository, TaskReadRepository>()</span>—. Como ya fue mencionado antes, la abstracción <ahref="../src/TaskManagement.Application/Interfaces/IDomainEventDispatcher.cs"><spanclass="tt">IDomainEventDispatcher</span></a> definida en la capa de aplicación se implementa con la clase <ahref="../src/TaskManagement.Infrastructure/EventDispatching/MediatRDomainEventDispatcher.cs"><spanclass="tt">MediatRDomainEventDispatcher</span></a> de esta capa de infraestructura y la instancia se crea en tiempo de ejecución también con injección de dependencias en la capa de interfaz API en <ahref="../src/TaskManagement.API/Program.cs"><spanclass="tt">Program</span></a> —ver <spanclass="tt">builder.services...AddScoped<IDomainEventDispatcher,
182
182
MediatRDomainEventDispatcher>()</span>—. El proyecto <ahref="../src/TaskManagement.Infrastructure/TaskManagement.Infrastructure.csproj"><spanclass="tt">TaskManagement.Infrastructure</span></a> referencia solamente el proyecto <ahref="../src/TaskManagement.Application/TaskManagement.Application.csproj"><spanclass="tt">TaskManagement.Application</span></a>, la dependencia es de un círculo externo a un círculo interno. Esta capa de infraestructura tiene también la configuración de los frameworks de acceso a datos.</li>
183
-
<li><ahref="./html/namespaceTaskManagement_1_1API.html">TaskManagement.API</a> es una aplicación web en .NET en la que se define la interfaz, en esta demo, una API REST. El proyecto referencia tanto al proyecto <ahref="../src/TaskManagement.Application/TaskManagement.Application.csproj"><spanclass="tt">TaskManagement.Application</span></a> como al proyecto <ahref="../src/TaskManagement.Infrastructure/TaskManagement.Infrastructure.csproj"><spanclass="tt">TaskManagement.Infrastructure</span></a>, ambos en círculos internos. Como toda aplicación web en .NET la carpeta <ahref="../src/TaskManagement.API/Controllers/"><spanclass="tt">Controllers</span></a> contiene los controladores que implementan los <em>endpoint</em> de la API REST —ver por ejemplo <ahref="../src/TaskManagement.API/Controllers/TasksController.cs"><spanclass="tt">TasksController.CreateTaskRequest</span></a>—. El archivo <ahref="../TaskManagement.http"><spanclass="tt">TaskManagement.http</span></a> tiene ejemplos para invocar la API REST.</li>
183
+
<li><ahref="./namespaceTaskManagement_1_1API.html">TaskManagement.API</a> es una aplicación web en .NET en la que se define la interfaz, en esta demo, una API REST. El proyecto referencia tanto al proyecto <ahref="../src/TaskManagement.Application/TaskManagement.Application.csproj"><spanclass="tt">TaskManagement.Application</span></a> como al proyecto <ahref="../src/TaskManagement.Infrastructure/TaskManagement.Infrastructure.csproj"><spanclass="tt">TaskManagement.Infrastructure</span></a>, ambos en círculos internos. Como toda aplicación web en .NET la carpeta <ahref="../src/TaskManagement.API/Controllers/"><spanclass="tt">Controllers</span></a> contiene los controladores que implementan los <em>endpoint</em> de la API REST —ver por ejemplo <ahref="../src/TaskManagement.API/Controllers/TasksController.cs"><spanclass="tt">TasksController.CreateTaskRequest</span></a>—. El archivo <ahref="../TaskManagement.http"><spanclass="tt">TaskManagement.http</span></a> tiene ejemplos para invocar la API REST.</li>
184
184
</ol>
185
185
<p>[^3]: Algunos autores definen las abstracciones relacionadas con el dominio en la capa de dominio, aunque no sean utilizadas en esa capa. Siguiendo esos autores, interfaces como <spanclass="tt">ITaskRepository</span> se definirían en la capa de dominio. En esta demo, interfaces como esa son definidas en la capa de aplicación, porque es allí donde se usan.</p>
0 commit comments