• net core 3.1 webapi的开发遇到的问题


    1.用的是工厂仓储模式(数据层data)

    public interface IRepositoryFactory
        {
            IRepository<T> CreateRepository<T>(IDBContext dataContext) where T : class;
        }
     public class RepositoryFactory : IRepositoryFactory
        {
            public IRepository<T> CreateRepository<T>(IDBContext dataContext) where T : class
            {
                return new Repository<T>(dataContext);
            }
        }
    public class Repository<T> : IRepository<T> where T : class
        {
            private readonly DBContext DBContext;
    
            private readonly DbSet<T> dbset;
            public Repository(IDBContext _DBContext)
            {
                DBContext = _DBContext as DBContext;
                dbset = DBContext.Set<T>();
            }
      /// 泛型方法的实现

          /// <summary>
          /// 查询
          /// </summary>
          /// <returns></returns>
          public IQueryable<T> Query()
          {
            return dbset;
          }

    }
     public interface IRepository<T> : IDisposable where T : class
        {
            /// <summary>
            /// 事务
            /// </summary>
            /// <returns></returns>
            IDbContextTransaction BeginTransaction();
    
           ///泛型方法的定义

    /// <summary>

           /// 查询
           /// </summary>
           /// <returns></returns>
           IQueryable<T> Query();


    }
    public class DBContext : DbContext, IDBContext
        {
            public DBContext(DbContextOptions<DBContext> options
                ) : base(options)
            {
    
            }
    
            public override int SaveChanges()
            {
                return base.SaveChanges(true);
            }
    
            protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
            {
                if (!optionsBuilder.IsConfigured)
                {
                    optionsBuilder.UseSqlServer("Server=.;Data Source=(local);uid=sa;pwd=123456;DataBase=test");
                }
            }
            protected override void OnModelCreating(ModelBuilder modelBuilder)
            {
                modelBuilder.ApplyConfigurationsFromAssembly(typeof(CourseMap).Assembly);
    
                base.OnModelCreating(modelBuilder);
            }
        }
    

     在服务层

    public interface IBaseService
        {
            IRepository<T> CreateService<T>() where T : class, new();
        }
    public class BaseService : IBaseService
        {
            private readonly IRepositoryFactory _repfactory;
    
            private readonly IDBContext _context;
    
            public BaseService(IRepositoryFactory repfactory, IDBContext context)
            {
                _repfactory = repfactory;
    
                _context = context;
            }
    
            public IRepository<T> CreateService<T>() where T : class, new()
            {
                return _repfactory.CreateRepository<T>(_context);
            }
        }
     public interface IExampleService
        {
            /// <summary>
            /// 定义方法类型
            /// </summary>
            /// <returns></returns>
            Task<List<Example>> GetExampleListAsync();
    
    
        }
    public class ExampleService : BaseService, IExampleService
        {
            private readonly IRepository<Example> _example;
            public CourseService(IRepositoryFactory repositoryFactory, IDBContext context) : base(repositoryFactory, context)
            {
                _example = this.CreateService<Example>();
              
            }
            public async Task<Example> GetExampleListAsync()
            {
                  ///写业务逻辑,控制器调用
            }      
    
    
        }    

    然后在startup  的ConfigureServices注册

    services.AddScoped<IDBContext, DBContext>();
    services.AddScoped<IRepositoryFactory, RepositoryFactory>();

    2接口的调试,用swagger插件,需要有几个地方注意(注意引用的包)

    ①控制器要加路由,不然不显示,方式要加http,不然报错,返回的json格式和后台定义的不一样(大小写不一样)在注册服务中加上下面代码

     foreach (var item in GetClassName("xxx.Service"))
                {
                    {
                        foreach (var typeArray in item.Value)
                        {
                            if (item.Key == typeof(Service.Interface.IBaseService))
                            {
                                continue;
                            }
                            services.AddScoped(typeArray, item.Key);
                        }
                    }
                    services.AddMvc().AddNewtonsoftJson(options =>
                    {
                        options.SerializerSettings.ContractResolver = new Newtonsoft.Json.Serialization.DefaultContractResolver();
                        options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
                        options.SerializerSettings.Formatting = Formatting.Indented;
                        options.SerializerSettings.DateFormatString = "yyyy-MM-dd";
                    }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
                }
    
    
    
    Dictionary<Type, Type[]> GetClassName(string assemblyName)
            {
                if (!String.IsNullOrEmpty(assemblyName))
                {
                    Assembly assembly = Assembly.Load(assemblyName);
                    List<Type> ts = assembly.GetTypes().ToList();
    
                    var result = new Dictionary<Type, Type[]>();
                    foreach (var item in ts.Where(s => !s.IsInterface))
                    {
                        var interfaceType = item.GetInterfaces();
                        result.Add(item, interfaceType);
                    }
                    return result;
                }
                return new Dictionary<Type, Type[]>();
            }

    在Configure中添加

           // 添加Swagger有关中间件
                app.UseSwagger();
                app.UseSwaggerUI(c =>
                {
                    c.SwaggerEndpoint("/swagger/V1/swagger.json", "xxx.API");  
                    //c.RoutePrefix = string.Empty;   设置swagger路由,默认是/swagger/index.html,注意端口号 
                });

    ②自宿运行两种方式,一个是bin文件夹启动,里面有端口号,也可以选择api启用用debug模式,release不能调试

    遗留的问题1.Automap的使用,如何将Dto与实体映射,怎么配置文件,这样只要配置一次,就可以使用

    2 如何将list中的实体映射到dto中,不用foreach等循环

  • 相关阅读:
    使用MongoDB ruby驱动进行简单连接/CRUD/运行命令
    DBMS-SQL:聚集函数、嵌套子查询、数据库修改
    国内无法使用gem install解决办法
    AI-Local search&Nodeterministic Problems&Partial observations&Online search
    DBMS-关系模型
    DBMS-基本概念
    ros安装过程中部分包“hash校验和不符”报错解决办法
    AI: Chapter 3-Solving problems by searching
    Map数据结构
    Set和WeakSet数据结构
  • 原文地址:https://www.cnblogs.com/carlpeng/p/13154236.html
Copyright © 2020-2023  润新知