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等循环

 

posted @ 2020-06-17 19:19  青兰柳  阅读(957)  评论(0编辑  收藏  举报