.Net Core Mvc 2.1如何调用thrift

.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 ;
                    }
        }
  }

猜你喜欢

转载自blog.csdn.net/Teemo_2016/article/details/83184651