我正在从传统的。net mvc应用程序移植到。netcore。
原始应用流程:
OSMSelectController→OSMDB_Loader.cs→StatusController
读取连接字符串并初始化DAL。
这个connectionstring来自静态类,但当我调试的值是空在这里:
WPSGlobalSettings.ToolboxConnString
我有一个静态类读取连接字符串从appsettings
WPSGlobalSettings
public static class WPSGlobalSettings
{
public static NpgsqlConnectionStringBuilder ToolboxConnString = build_conn_str(ToolboxDatabaseName);
private static NpgsqlConnectionStringBuilder build_conn_str(string dbname)
{
string dbSetting = ConfigurationHelper.config.GetSection("ConnectionStrings")["DefaultConnection"];
...
}
}
控制器
public class StatusController : Microsoft.AspNetCore.Mvc.ControllerBase
{
protected StatusDAL status_dal = new StatusDAL(WPSGlobalSettings.ToolboxConnString);
}
这里给出了类型异常,wpsglobalsettings未初始化,toolboxconnstring为空。
我已经尝试将其作为单例添加到启动,但随后我得到
静态类型不能用作类型参数
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IConfiguration>(Configuration);
services.AddControllersWithViews();
services.AddSingleton<WPSGlobalSettings>();
ConfigurationHelper.Initialize(Configuration);
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
WPSGlobalSettings.Configure(env);
...
}
编辑:
我已经从Startup.cs中删除了以下内容
services.AddSingleton<WPSGlobalSettings>();
还介绍了DI如下
protected StatusDAL status_dal;//= new StatusDAL(WPSGlobalSettings.ToolboxConnString);
public StatusController(IConfiguration config)
{
status_dal = new StatusDAL(config.GetConnectionString("toolboxConnectionStrWPS"));
}
现在另一个问题是旧代码从另一个类调用控制器构造函数,如下所示:
OSMDB_Loader.cs
public StatusAck LoadOSMSections(OsmLoadRequest request)
{
StatusAck statusack = new StatusController().PostStatusRecord();
}
因此,我还在StatusController中添加了简单的构造函数:
public StatusController()
{
}
但是现在status_dal总是null
有些事情不安静,对吗?
我在这里和这里得到了一些帮助另外,静态会给多线程带来问题…from here
这是我的解决方案:
原应用流程为
OSMSelectController→OSMDB_Loader.cs→StatusController
读取连接字符串并初始化DAL。
:
在OSMSelectController中注入了IConfiguration并将其传递给OSMDB_Loader.cs
private IConfiguration _config;
public OsmSelectController(IConfiguration config)
{
_config = config;
}
public IActionResult AddRoadsOsm([FromBody]OsmLoadRequest request)
{
...
StatusAck statusack = new OSM_DBLoader(user_id).LoadOSMSections(request, _config);
}
OSMDB_Loader.cs
public StatusAck LoadOSMSections(OsmLoadRequest request, IConfiguration conf)
{
StatusAck statusack = new StatusController(conf).PostStatusRecord(); // Issue here is that you need to get the uri
...
}
这样,StatusController的正确构造函数就可以读取连接字符串
的配置值StatusController
protected StatusDAL status_dal;
public StatusController()
{
status_dal = new StatusDAL(WPSGlobalSettings.ToolboxConnString);
}
public StatusController(IConfiguration config)
{
status_dal = new StatusDAL(config.GetConnectionString("toolboxConnectionStrWPS"));
}
如果有人能详细说明GlobalSettings静态文件是如何构成问题的,以及我们在。net core中有DependencyInjection和Singleton模式,我仍然会很感激。