静态类型不能用作类型参数



我正在从传统的。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模式,我仍然会很感激。

最新更新