Registro: Cómo usar ASP.NET Core y EnityFramework Core para separar las operaciones de la base de datos y las entidades de la base de datos

Resumen del prólogo:

  Existe un marco de sitio web existente, que incluye una aplicación web de proyecto principal, un proyecto de andamio A que incluye la interfaz IIdentityUser. AuthenticationService, el servicio utilizado para manejar la autenticación del usuario, se encuentra en el espacio de nombres B. Usuario de entidad para guardar datos: IIdentityUser Location item C. La relación entre proyectos es que B y C dependen del proyecto A.

 

Requisitos:

  Ahora hay un nuevo proyecto D, en este proyecto hay un DUser: IIdentityUser. Cómo lidiar con él es la forma más elegante de guardar usuarios en DUser sin agregar referencias y modificar el proyecto B.

 

Ejemplo real:

  En ASP.NET CORE, hay algo llamado IdentityServer. Hay algo en esto. Escribió un código similar a IdentityServerBuilder.AddService <TUser, TRole> (), ¿cómo lograrlo?

 

Solución:

  1. Cree una nueva clase genérica (esta clase se puede marcar como interna, y la externa no necesita comprender ni acceder):

public class UserContext <TUser> 
        donde TUser: class, IIdentityUser, new () 
    { 
        public YourContext dbContext; 
        Public UserContext (YourContext ctx) => dbContext = ctx; 

        Usuarios públicos de DbSet <TUser> 
        { 
            get 
            { 
                return dbContext.Set <TUser> (); 
            } 
        } 

        public void SaveChanges () 
        { 
            dbContext.SaveChanges (); 
        } 
    }

  2. Cree un nuevo servicio para la operación (tenga en cuenta que todas las operaciones requeridas están escritas en esto, y esta interfaz estará expuesta en el futuro)

public class UserService <TUser>: IUserService 
        donde TUser: clase, IIdentityUser, new () 
    { 
        private UserContext <TUser> dbContext; 
        Public UserService (YourContext ctx, IServiceProvider provider) 
        { 
            dbContext = new PermissionContext <TUser> (ctx.DbContext); 
        } 
     
   public TUser GetUserById (Guid id) 
   { 
      return dbContext.Users.FirstOrDefault (e => e.ID == id); 
   } 
    }

  

  3. Agregar una jeringa

    public static class AuthenticationInject 
    { 
        public static IServiceCollection AddAuthenticationContext <TUser> (este IServiceCollection services) 
            donde TUser: IIdentityUser 
        { 
            var serviceType = typeof (UserService <>). MakeGenericType (typeof (TUser)); 
            services.AddSingleton (typeof (IUserService), serviceType); 

            servicios de devolución; 
        } 
    }

  Punto técnico: utilice el método MakeGenericType para cargar dinámicamente instancias de clase genéricas. Si el tipo es UserService <TUser, TRole>, typeof (UserService <,>). MakeGenericType (typeof (T1), typeof (T2))

  Hasta ahora, hemos dividido el nombre del tipo de la clase genérica en la variable. Entonces puedes jugar 10,000 patrones.

  4. En la aplicación web, inyecte variables relacionadas

        // Este tiempo de ejecución llama a este método. Use este método para agregar servicios al contenedor. 
        // Para obtener más información sobre cómo configurar su aplicación, visite https://go.microsoft.com/fwlink/?LinkID=398940 
        public void ConfigureServices (servicios IServiceCollection) 
        { 
            services.AddAuthenticationContext <DUser> (); 
        }

  

  Analizar dependencias:

  La aplicación web de proyecto de ejecución depende de A, B, D, B y D, los proyectos solo dependen de A. Aún más, se puede desacoplar de nuevo. Cambie la función AddAuthenticationContext de la función genérica a AddAuthenticationContext (Type userType), y puede ir más allá y cambiarla a AddAuthenticationContext (tipo de cadena) para obtener el tipo a través de la reflexión y la configuración, para desacoplar los proyectos A y D.

  Capacidad de expansión:

  En el futuro, habrá nuevos proyectos E, EUser. Solo necesita disociar D y A, y luego asociar E y A. Simplemente modifique la función AddAuthenticationContext para cumplir con los requisitos. Por supuesto, si desea estar de humor, incluso puede participar en un código de autodescubrimiento (como este en mi proyecto, que analiza automáticamente el objeto IIdentityUser y luego lo adjunta al contexto. Se utiliza un atributo para marcar qué usuario usar para este proyecto). Incluso si estás de humor, puedes hacerlo configurable. De todos modos, puedes poner EF Core en 10,000 poses.

Supongo que te gusta

Origin www.cnblogs.com/Pray4U/p/12732296.html
Recomendado
Clasificación