TicketMaster es una aplicación de escritorio en C# diseñada para gestionar boletos, calcular su costo y la fecha de regreso. La aplicación sigue una arquitectura limpia con separación de responsabilidades en varias capas: UI, BLL, DAL y DomainModel.
src/
├── Application/
│ ├── Common/
│ │ └── Interfaces
│ │ └── Interfaces generales ...
│ └── Interfaces/
│ └── UseCase
│ └── casos de uso ...
├── Domain/
│ ├── Entities/
│ │ ├── Boleto.cs
│ │ ├── Turista.cs
│ │ └── Ejecutivo.cs
│ ├── Enums/
│ │ └── TipoBoleto.cs
│ ├── Dtos/
│ └── Common/
│
├── TicketMaster/
│ ├── Controllers/
│ │ └── BoletoController.cs
│ └── Views/
│ └── FormPrincipal.cs
│
├── Infrastructure/
│ ├── Repositories/
│ │ ├── MemoryDataRepository
│ │ ├── RepositoryFactory
│ │ └── SqlDataRepository.cs
│ └── Extensions/
│ └── ServiceCollectionExtensions.cs
└── Program.cs
-
Application (BLL):
- Contiene la lógica de negocio de la aplicación.
- Interactúa con la capa de dominio y la capa de infraestructura para procesar las solicitudes.
-
Domain (DomainModel):
- Define las entidades del dominio, las interfaces y las excepciones específicas del dominio.
- Representa el núcleo de la aplicación.
-
TicketMaster (UI):
- Maneja la interfaz de usuario y la presentación de datos.
- Contiene los controladores y vistas para la interacción con el usuario.
-
Infrastructure (DAL):
- Gestiona el acceso a los datos y la persistencia.
- Implementa los repositorios y contextos de bases de datos.
-- Crear tabla TipoBoleto
CREATE TABLE TipoBoleto (
Tipo INT PRIMARY KEY,
Descripcion VARCHAR(50) NOT NULL
);
Incertar datos en TipoBoleto
INSERT INTO TipoBoleto (Tipo, Descripcion) VALUES (0, 'Turista');
INSERT INTO TipoBoleto (Tipo, Descripcion) VALUES (1, 'Ejecutivo');
-- Crear tabla Boleto
CREATE TABLE Boleto (
Numero int PRIMARY KEY IDENTITY(1,1) NOT NULL,
CostoEmbarque float NOT NULL,
FechaSalida datetime2(3) NOT NULL,
TiempoEnDias int NOT NULL,
FechaRegreso datetime2(3) NOT NULL,
TipoBoletoId int NULL,
FOREIGN KEY (TipoBoletoId) REFERENCES TipoBoleto(Tipo)
);
-
Añadir un Boleto:
- Ingrese los detalles del boleto en los campos correspondientes y haga clic en "Añadir".
-
Actualizar un Boleto:
- Ingrese el número del boleto, modifique los detalles y haga clic en "Actualizar".
-
Buscar un Boleto:
- Ingrese el número del boleto y haga clic en "Buscar" para ver los detalles.
-
Eliminar un Boleto:
- Ingrese el número del boleto y haga clic en "Eliminar".
-
Patrón Abstract Factory:
- Dónde: En la clase
BoletoRepositoryFactory
. - Descripción: Este patrón se utiliza para crear familias de objetos relacionados sin especificar sus clases concretas. La fábrica abstrae el proceso de creación del repositorio, permitiendo cambiar el backend sin cambiar el código del cliente.
- Dónde: En la clase
-
Patrón Repository:
- Dónde: En las interfaces y clases
IBoletoRepository
eInMemoryBoletoRepository
. - Descripción: Este patrón se utiliza para encapsular el acceso a los datos, proporcionando una interfaz para realizar operaciones sobre los datos (CRUD: Crear, Leer, Actualizar, Eliminar). Esto aísla la lógica de negocio de la lógica de acceso a datos.
- Dónde: En las interfaces y clases
-
Patrón Factory Method:
- Dónde: En los constructores de las clases
Turista
yEjecutivo
que heredan deBoleto
. - Descripción: Este patrón se utiliza para delegar la creación de objetos a las subclases. Las clases
Turista
yEjecutivo
implementan su propia lógica de construcción.
- Dónde: En los constructores de las clases
-
Patrón Strategy:
- Dónde: En los métodos
CalcularRegreso
yCostoBoleto
de las clasesTurista
yEjecutivo
. - Descripción: Este patrón permite definir una familia de algoritmos, encapsular cada uno de ellos y hacerlos intercambiables. Tanto
Turista
comoEjecutivo
tienen diferentes implementaciones para calcular el costo del boleto y la fecha de regreso.
- Dónde: En los métodos
-
Patrón Template Method:
- Dónde: Implícitamente en la clase abstracta
Boleto
con métodos que deben ser implementados por las subclases (CalcularRegreso
yCostoBoleto
). - Descripción: Este patrón define el esqueleto de un algoritmo en una operación, delegando algunos pasos a las subclases. Permite que las subclases redefinan ciertos pasos de un algoritmo sin cambiar su estructura.
- Dónde: Implícitamente en la clase abstracta
-
Patrón Singleton (Potencialmente):
- Dónde: Podría aplicarse a la clase
InMemoryBoletoRepository
si se quisiera asegurar que solo exista una instancia del repositorio en memoria. - Descripción: Este patrón asegura que una clase tenga solo una instancia y proporciona un punto de acceso global a ella.
- Dónde: Podría aplicarse a la clase