当前位置: 首页 > 编程语言 > C#

使用IConfigurationRoot将应用程序的连接字符串传递到ASP.NET 5中的存储库类库分享

时间:2023-04-10 19:56:14 C#

C#学习教程:使用IConfigurationRoot将应用程序的连接字符串传递到ASP.NET5中的存储库类库我有一个ASP.NET5MVCWeb应用程序,在Startup.cs中我看到公共属性IConfigurationRootConfiguration被设置为builder。建造();在整个MVCweb应用程序中,我可以执行Startup.Configuration["Data:DefaultConnection:ConnectionString"]从appsettings.json文件中获取连接字符串。如何使用构造函数注入将ASP.NET5MVCappsettings.json指定的连接字符串传递到我的存储库类库?更新:这是所有其他存储库继承自的基本存储库(如您所见,我现在在这里有一个硬编码的连接字符串):;";publicstaticSqlConnectionGetOpenConnection(){varcs=ConnectionString;varconnection=newSqlConnection(cs);connection.Open();返回连接;我的appsettings.json文件中的asp在.net5webapp中,我有以下内容,相当于将连接字符串添加到.net4.5webapp中的web.config:"Data":{"DefaultConnection":{"ConnectionString":"服务器=MYSERVER;数据库=MYDATABASE;Trusted_Connection=True;"同样在我的asp.net5web应用程序中,我的Startup.cs中有以下默认代码,它将站点配置加载到IConfigurationRoot类型的公共属性中:publicIConfigurationRootConfiguration{get;放;}//类构造函数publicStartup(IHostingEnvironmentenv){//设置配置源。varbuilder=newConfigurationBuilder().AddJsonFile("appsettings.json").AddJsonFile($"appsettings.{env.EnvironmentName}.json",optional:true);if(env.IsDevelopment()){//有关使用用户机密存储的更多详细信息,请参阅http://go.microsoft.com/fwlink/?LinkID=532709builder.AddUserSecrets();}builder.AddEnvironmentVariables();Configuration=builder.Build();}现在在我的asp.netweb应用程序中,如果我想访问任何应用程序设置,我可以简单地执行以下操作:启动。Configuration["Data:DefaultConnection:ConnectionString"]但不幸的是,我无法从我的类库中执行此操作。如果有人想尝试解决此问题,请执行以下重现步骤:创建一个新的ASP.NET5MVCWeb应用程序已添加另一个类型为类库(包)的项目。弄清楚如何将appsettings从ASP.NET5MVCApp传递到类库更新后我仍然无法得到它。这是我的代码:publicclassBaseRepo{privatereadonlyIConfigurationRootconfig;publicBaseRepo(IConfigurationRootconfig){this.config=config;}}这样的声明不起作用,因为BaseRepo现在需要构造函数参数。publicclassCustomerRepo:BaseRepository,ICustomerRepo{publicCustomerFind(intid){using(varconnection=GetOpenConnection()){...}}}在您的Startup.cs文件中添加以下方法publicvoidConfigureServices(IServiceCollectionservices){services.AddSingleton(_=>配置);然后像这样更新你的BaseRepo类publicclassBaseRepo{privatereadonlyIConfigurationconfig;publicBaseRepo(IConfigurationconfig){this.config=config;}publicSqlConnectionGetOpenConnection(){stringcs=config["Data:DefaultConnection:ConnectionString"];SqlConnection连接=newSqlConnection(cs);connection.Open();返回连接;}}ASP.NET提供了自己的配置设置传递方式。假设你在appSettings.json中有这个:{"Config":{"Setting1":1,"Setting2":"SO"}}然后你需要一个这样的类:publicclassMyConfiguration{publicintSetting1{get;放;}publicstringSetting2{get;放;这允许您通过添加行services.Configure(Configuration.GetSection("Config"));来使用此配置配置服务;配置服务。然后,您可以通过执行以下操作在构造函数中注入配置:publicclassSomeController:Controller{privatereadonlyIOptionsconfig;publicServiceLocatorController(IOptionsconfig){this.config=config;}[HttpGet]publicIActionResultGet(){返回新的HttpOkObjectResult(config.Value);这个例子是一个控制器。但是您可以对应用程序的其他层执行相同的操作。我的存储库类中有一个构造函数,它将数据库连接字符串作为参数。当我添加注册表存储库时,这对我有用。在startup.cs文件中的ConfigureServies()中添加:services.AddScoped(c=>newRepos(Configuration["DbConnections:ConnStr1"]));IRepos.cs是接口,Repos.cs是实现它的类。当然,Configuration只是对构造的IConfigurationRoot对象的引用。如果你的项目的startUp.cs在startUp.cs中包含services.AddEntityFramework().AddSqlServer().AddDbContext(options=>options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]));和你的存储库cs文件正在获取构造函数注入,如下所示publicclassMyRepo:IRepo{privatereadonlyYourDbContextdbContext;publicMyRepo(YourDbContextctx){dbContext=ctx;YourDbContext将自动解析。已经有一个扩展方法可以用来专门从aspsettings.json中获取连接字符串。在appsettings.json中定义连接字符串如下:{"ConnectionStrings":{"Local":"Datasource=.\SQLExpress;InitialCatalog=......","Test:":"Datasource=你的服务器;......”},“日志记录”:{“IncludeScopes”:false,“LogLevel”:{“默认”:“调试”,“系统”:“信息”,“微软”:“Information"}}}在Startup.cs的publicvoidConfigureServices(IServiceCollectionservices)方法中,可以得到连接字符串,如下:varconnectionString=this.Configuration.GetConnectionString("Local");GetConnectionString扩展来自Microsoft。扩展。配置。享受:)更新我一开始不想详细说明,因为这里的问题已经被标记为已回答。但我想我可以在这里展示我的2美分。如果您确实需要将整个IConfigurationRoot对象注入控制器,@Chrono会以正确的方式显示它。如果您不需要整个对象,您应该只获取连接字符串,将其传递到ConfigureServices()调用中的DbContext,然后将DbContext注入控制器。@PrashantLakhlani显示正确。我只是说在@PrashantLakhlanipost中你可以使用GetConnectionString扩展来清理你的代码。您需要的是在您的类库项目中创建一个类来访问您网站项目中的appsettings.json并返回连接字符串。{私有静态字符串_connectionString;publicstaticstringGetConnectionString(){if(string.IsNullOrEmpty(_connectionString)){varbuilder=newConfigurationBuilder().AddJsonFile("appsettings.json");配置=builder.Build();_connectionString=Configuration.Get("数据:MyDb:ConnectionString");}返回_connectionString;}publicstaticIConfigurationRoot配置{得到;放;一个稍微不同的方法是在你的类库中创建一个静态类,你可以在其中从Configure(..)调用方法-Startup.cs中的方法:publicvoidConfigure(IApplicationBuilderapp,IHostingEnvironmentenv){...ConnectionManager.设置配置(配置);在这种情况下,我在ConfigureServices中添加了ConfigurationAsaSingleton:services.AddSingleton(_=>Configuration);我的ConnectionManager看起来像这样:publicclassConnectionManager{privatestaticIConfigurationcurrentConfig;publicstaticvoidSetConfig(IConfigurationconfiguration){currentConfig=configuration;}//////获取到数据库的连接。///公众号ticSqlConnectionGetConnection{get{stringconnectionString=currentConfig.GetConnectionString("MyConnection");//为每个查询创建一个新连接。SqlConnection连接=newSqlConnection(connectionString);返回连接;这可能与对象生命周期等有关,也可能与对象生命周期等无关,我当然不是静态类的粉丝,但据我所知这是一种可行的方法您可以从配置文件中提取ConnectionString而不是传递一个配置。以上就是C#学习教程:在ASP.NET5中使用IConfigurationRoot将应用程序的连接字符串传递给repository类库,如果对大家有用,需要进一步了解C#学习教程,希望大家多多指教多多关注——本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: