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