Entity Core 2.0— Inyección de dependencias y Control de inversión
--
Despues de mucho leer y tratar de encontrar la manera adecuada de crear una plantilla para proyectos llegue a lo siguiente.
- Cree una Bd básica para usar el database first del entity core, esto no soporta nada gráfico y no tiene un wizard toca algunas cosas por linea de comandos.
- Cree una solución en blanco.
- Cree un libreria de clases; mucho cuidado de ser core, no .Net Standar, no .Net Framework.
4. Crear los modelos. Mapear las entidades de la base de datos, esto se debe hacer por la linea de comando en el nuget con la siguiente instrucción.
Scaffold-DbContext “Server=<Nombre o ruta del servidor>; Database=<Nombre de la BD>;Trusted_Connection=True; User Id=<user>*; Password=<password>*;” Microsoft.EntityFrameworkCore.SqlServer -OutputDir <Nombre de la carpeta donde quedaran las clases>
Desde MacOS se pueden instalar las dependencias por medio del nuget o por medio de la consola, en el siguiente link. https://stackoverflow.com/questions/44502698/run-scaffold-dbcontext-on-visual-studio-for-mac si se quiere una version especifica se usa al final del comando -v <version>.
Instalar dotnet tool
install — global dotnet-ef — version 2.2.6
Probar con dotnet ef
Antes de usuar el comando para mapear la base de datos usar dotnet restore en la consola y luego usar este comando:
dotnet ef dbcontext scaffold “Server=<server>;User Id=<user>;Password=<password>;Database=<database>” “Microsoft.EntityFrameworkCore.SqlServer” -c DbContext -o Models
ó intentar este .
dotnet ef dbcontext scaffold “Server=<server>;Database=<databse>;User Id=<user>;Password=<pass>” Microsoft.EntityFrameworkCore.SqlServer -o Models
5. Saque el DbContext de la carpeta y revise las referencias.
6. Cree una libreria de clases (core) y la llame Servicio/Repositorio, para poner todas las operaciones de acceso a datos, cada entidad o clase debe tener sus metodos CRUDS.
7. Cree una libreria de calses (core) que sera el middleware por aca pasara todo, es es la encargada de hacer la inversión de control y la inyección de dependencias.
9. Cree una libreria de claes (core) llamada DTOs que sera la representación de las entidades en clases para poder exponerlas, muy importante entender que estan son las que reciben lo que llega desde el API y con el middleware se transforman a las clases que representan entidades.
10. En la libreria llamada middleware cree una clase llamada automapper, lo que hara esta clase es cambiar un DTO por una clase entidad, se debe usar el using de automapper y hacer la referencias al proyecto DTOs y el proyecto Datos.
void init()
{
Mapper.Initialize(config =>
{
config.CreateMap<User, userDTO>().ReverseMap();
} );
}
11. Cree una libreria mas (core) llamada Reglas, la idea con esta libreria es poder hacer todo el procesamiento de negocio aca.
12. Vamos a crear una servicio para hacer el guardado de un usuario.
public void Save(userDTO dto)
{
using (TestEFCoreContext db = new TestEFCoreContext())
{
db.User.Add(Mapper.Map<userDTO, User>(dto));
db.SaveChanges();
}
}
13. Creamos una interfaz de ese servicio, hago servicios por cada clase entidad.
14. Cada que creemos una interfaz hay que ir a middleware para que sepa de que clase se implementa esta, Inyección de dependencias.
15. En el proyecto middelware cree otra clase llamada inyección que mapea cada interfaz con su clase.
public static IServiceCollection InitializeInjecciton(this IServiceCollection service, IConfiguration configuration) {
service.AddDbContext<TestEFCoreContext>();
service.AddScoped<IuserService, userService>();
return service;
}
16. Como la idea es que el API reciba datos y los envie a las reglas para procesarlos, vamos a crear la regla que para este caso recibe el usuario que vamos a crear.
private readonly IuserService _service;
public UserRule(IuserService _service)
{
this._service = _service;
}public void Save(userDTO dto)
{
_service.Save(dto);
}
Hay que implementar la interfaz para esta regla para tener acceso al metodo Save desde el controlador del API.
17. Mapear en el middleware en la case inyección la nueva interfaz de reglas.
Esta plantilla estara en el siguiente enlace de github en la rama core.