.net core MVC采用的是依赖注入模式,服务都注册在StartUp类的ConfigureServices方法中
public void ConfigureServices(IServiceCollection services)
{
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<AppDBContext>()
.AddDefaultTokenProviders();
services.Configure<CookiePolicyOptions>(options =>
{
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddDbContext<AppDBContext>(options =>
options.UseMySql(Configuration.GetConnectionString("CardContext"), b => b.MigrationsAssembly("Vcyber.CardCenter.Web"))
);
services.AddScoped(typeof(IRepository<>), typeof(EfRepository<>));
services.AddScoped(typeof(IAsyncRepository<>), typeof(EfRepository<>));
services.AddScoped<IUserService, UserService>();
services.AddScoped<IUserRepository, UserRepository>();
services.AddScoped<ICardTypeRepository, CardTypeRepository>();
services.AddScoped<IProjectRepository, ProjectRepository>();
services.AddScoped<ICardInfoRepository, CardInfoRepository>();
services.AddScoped<ISysOperationRecordService, SysOperationRecordService>();
services.AddDistributedMemoryCache();
services.AddSession();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
services.AddOptions();
services.Configure<InterFaceConfig>(Configuration.GetSection("InterFaceConfig"));
}
thrift服务端的方法不能写在Controller里面,又要在项目启动的时候自动启动,怎么办呢,只能写在Configure方法中来调用了。
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseSession();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=index}/{id?}");
});
//启动Thrift服务
app.UseThriftServer();
}
UseThriftServer为扩展方法,开启服务需要传入数据库的实例才能去做数据库的操作,如何在扩展方法中获取实例传给服务端这是关键
public static class ApplicationExtenssion
{
public static IApplicationBuilder UseThriftServer(this IApplicationBuilder appBuilder)
{
var services = appBuilder.ApplicationServices.CreateScope().ServiceProvider;
var context = services.GetService<AppDBContext>();//获取数据库连接实例
var config = services.GetService<IOptions<InterFaceConfig>>();//获取配置文件
var port =Convert.ToInt32(config.Value.Port);//端口号
var service = new Server(context);
Processor processor = new Processor(service);
TServerTransport transport = new TServerSocket(port);
TServer server = new TThreadPoolServer(processor, transport);
var lifeTime = services.GetService<IApplicationLifetime>();
lifeTime.ApplicationStarted.Register(() =>
{
server.Serve();
});
lifeTime.ApplicationStopped.Register(() =>
{
server.Stop();
transport.Close();
});
return appBuilder;
}
}
这样thrift服务端就可以正常操作数据库了,服务端代码如下:
public class Server : Iface
{
private AppDBContext _dbContext;
public Server(AppDBContext context)
{
_dbContext = context;
}
#region 卡券列表
/// <summary>
/// 卡券基础信息列表
/// </summary>
/// <param name="projectNo">项目编号</param>
/// <param name="cardTypeNo">类型编号</param>
/// <returns></returns>
public CardInfoListResult GetCardInfoList(string projectNo, string cardTypeNo)
{
var proj = _dbContext.Projects.Where(p => p.No == projectNo).FirstOrDefault();
if (proj == null)
{
model.IsSuccess = false;
model.Message = "项目编号不存在";
}
else
{
model.IsSuccess = true;
model.Message = "查询成功";
model.Data = proj ;
}
}
}