前情提要:

  现有一个网站框架,『包罗』主体项目WebApp一个,『包罗』 IIdentityUser 《接《口》【的】基架项目》 A。【用于处】置用户身份验证【的】‘服务’ AuthenticationService 位于命名空间B。用于保留数据【的】实体 User : IIdentityUser 位置项目C。项目之间【的】关系是B‘{和}’C‘『依赖』’项目A。

 

需求:

  现(『在』)有一个新项目D,(『在』)这个项目{里}有一个DUser : IIdentityUser 。若何处置才气最优雅【的】(『在』)不添加引用‘{和}’修改项目B【的】前提下,{将用户保留至}DUser。

 

〖现〗实例子:

  (『在』)ASP.NET CORE「中」,有一个器械叫IdentityServer。内{里}就有这个器械,他写【的】是类似IdentityServerBuilder.AddService<TUser, TRole>()这种代码,若何实现?

 

解决方案:

  1、(新建一个泛类)(这个类可以符号为internal,外部不需要领会, 也不需要[接见):

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

        public DbSet<TUser> Users
        {
            get
            {
                return dbContext.Set<TUser>();
            }
        }

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

  2、新建一个用以操作【的】‘服务’(注重,所有需要【的】操作都往这{个内{里}写},未来露出【的】也是这个接《口》)

public class UserService<TUser> : IUserService
        where TUser: class, 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、添加一个注射器

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

            return services;
        }
    }

  手艺点:<使用>MakeGenericType方式可以动态加载泛类实例。若是类型是 UserService<TUser, TRole>,【则写成】 typeof(UserService<,>).MakeGenericType(typeof(T1), typeof(T2))

  至此,我们就已经将泛类【的】类《型》名拆到了变量内{里}。{然后就可以}玩出一万种名堂了。

  4、(『在』)WebApp{里},‘注入相关变’量

        // This method gets called by the runtime. Use this method to add services to the container.
        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddAuthenticationContext<DUser>();
        }

  

  〖剖析『依赖』关系〗:

  执行项目WebApp『依赖』A,B,D,B‘{和}’D项目只『依赖』A。「甚至」于,这{里}还能再解耦。「把函数」AddAuthenticationContext从泛型函数{改成} AddAuthenticationContext(Type userType),还可以再进一步,{改成}AddAuthenticationContext(string type),通过反射‘{和}’设置来取类型,做到A项目‘{和}’D{项目解耦}。

  〖扩展性〗:

  (『在』)未来,有新项目E,EUser。(只需要将)D‘{和}’A「排除星散」,再将E‘{和}’A“举”行关联。只需要修改 AddAuthenticationContext 函数,即可满足要求。「固然」, 若是要[有心情,你甚至可以搞一个自动发现【的】代码(好比我项目{里}就是这么搞【的】,‘自’动剖析IIdentityUser【的】工具,然后附加给Context,<为了保证有多个实现>时〖能准确附加〗,『我做了一』个Attribute{用来符号这个项目}要用哪个User)。再有心情还可以做成设置式【的】,横竖你可以把EF Core{摆出一万种姿势}。

,

阳光(『在』)线

阳光(『在』)线www.lanbao-film.com(原诚信(『在』)线)现已开放阳光(『在』)线手机『版下载』。阳光(『在』)线游戏公平、【公开】、(公正),用实力赢取信誉。

声明:该文看法仅代表作者自己,与Sunbet 申博无关。转载请注明:衢州房屋出租:纪录:若何使用ASP.NET Core‘和’EnityFramework Core『实现』 数据库操作 ‘和’ 数据库实体 {的项目}星散
评论关闭

分享到:

伦敦再封天下顶流,这一全球地标又爆红!