gpt4 book ai didi

c# - 在 AspNetCore 中构建/实例化静态类的正确方法

转载 作者:行者123 更新时间:2023-12-04 14:25:44 25 4
gpt4 key购买 nike

我在 ASPNetCore 2017 中构建了这个静态 AppSettings 类的工作示例。我想知道是否有更简单/更好的方法来做到这一点。我是新手,所以我希望得到一些专家建议..

我正在使用 MiddleWare 组件来实例化包含所有 Json appSettings 值的静态 AppSettings 类。我这样做是因为我不希望 Controller 类必须知道如何设置它要查询的数据库的连接字符串。我正在使用 SQLClient(不是 EF,因为我所有的调用都是对存储过程的调用)。

这是我的代码:

appSettings.Json

{ “应用程序设置”:{ "WarehouseConnectionString": "Data Source=[Removed]\SQLExpress;Initial Catalog=Warehouse;Integrated Security=True;" },

AppSettings 类

public class AppSettings
{
public AppSettings()
{
// Set default values of our options.
WarehouseConnectionString = "WarehouseConnectionString";
}

/// <summary>
/// Our Warehouse DB Connection string.
/// </summary>
public static string WarehouseConnectionString { get; set; }
}

我的中间件类:

public class ApplicationSettingsService
{
private readonly RequestDelegate next;

public ApplicationSettingsService(RequestDelegate next)
{
this.next = next;
}

public async Task Invoke(HttpContext context, IOptions<AppSettings> appSettings)
{
// Create our static instance of our AppSettings class.
AppSettings _settings = appSettings.Value;

await next(context);
}
}

我的 Starup.cs 类

public class Startup
{
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
Configuration = builder.Build();
}

public IConfigurationRoot Configuration { get; }

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
//************************************************//
// Adds services required for using options.
//************************************************//
services.AddOptions();

//**********************************************************************//
// Register the IConfiguration instance which MyOptions binds against the
// AppSettings section of the appsetting.json file only.
//**********************************************************************//
services.Configure<AppSettings>(Configuration.GetSection("AppSettings"));

// Add framework services.
services.AddMvc();
}

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();

//******************************************************//
// Add our own custom Application Settings Middleware //
//******************************************************//
app.UseMiddleware<ApplicationSettingsService>();

if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseBrowserLink();
}
else
{
app.UseExceptionHandler("/Home/Error");
}

app.UseStaticFiles();

app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
//template: "{controller=Home}/{action=Index}/{id?}");
template: "{controller=Box}/{action=Index}/{id?}");
});
}
}

使用 AppSetting 值的我的数据库连接类。

public static class DBConnection
{
private static string ConnectionString = AppSettings.WarehouseConnectionString;


public static SqlConnection GetConnection()
{
return new SqlConnection(ConnectionString);
}
}

当客户端( Controller )调用数据库类时,他们不必指定连接字符串,“仓库”已经知道它应该连接到哪个数据库...

   DHRIM5_StoredProcedureDatabaseExample.Data.Warehouse.StoredProcedures sp = new Data.Warehouse.StoredProcedures();

// GET: Box
public ActionResult Index()
{
IList<Box> tests = sp.SPGetBoxes().ToList();
return View(tests);
}

感谢您的帮助。

最佳答案

一般来说,您应该避免依赖于基础架构的静态类,因为很难对此类类进行单元测试。但是您可以在单例范围内使用非静态类,因此您将只有一个实例。在你的情况下 - AppSettings.cs

public class AppSettings
{
public AppSettings()
{
// Set default values of our options.
WarehouseConnectionString = "default_value_if_needed";
}

public string WarehouseConnectionString { get; set; }
}

Startup.csConfiguration 获取值(value)并将其注册为单例。

public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddMvc();

var appSettings = Configuration.GetSection("AppSettings").Get<AppSettings>();
services.AddSingleton(appSettings);
}

然后你可以把这个值注入(inject)到构造函数中

public class DBConnection
{
private readonly string connectionString;

public DBConnection(AppSettings settings)
{
this.connectionString = settings.WarehouseConnectionString;
}

public SqlConnection GetConnection()
{
return new SqlConnection(this.connectionString);
}
}

注意这种情况AppSettings在启动应用程序中是只读的,所以如果你改变 appsettings.json文件,如果不重新启动应用程序,设置将不会应用。
现在你还应该注册DbConnection作为 Startup.cs 中的单例- services.AddSingleton<DBConnection>();并通过构造函数参数请求其对象。

public class StoredProcedures
{
private readonly DBConnection connection;
public StoredProcedures(DBConnection connection)
{
this.connection = connection;
}
}

当然,最好将接口(interface)与实现分开,只使用接口(interface)。

关于c# - 在 AspNetCore 中构建/实例化静态类的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45058527/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com