c# - 我在哪里可以在我的 Asp.Net Core 项目中保留经常更改的联系信息,以便我可以更新它(如配置文件)
问题描述
Ye Olde Asp.Net 项目曾经有一个web.config
文件,我可以(不难)在其中创建自定义配置部分和“配置阅读器”类并保留联系人列表:
<myConfigSection>
<contacts>
<contact name="Luke SkyWalker" email="luke@degobah.com" phone="123-456-7890" />
<contact name="Anakin SkyWalker" email="whiner@deathstar.com" phone="987-654-3211" />
</contacts>
</myConfigSection>
这让我可以很容易地从我的代码中访问它,如果我需要更新联系人,我可以只更新web.config
.
我注意到web.config
在 Asp.Net Core 的新热点中缺少 。实现这样的事情的首选方法是什么?
解决方案
理想情况下,一个数据库文件——如果你愿意,你可以使用一个简单的 sqlite 数据库。
否则,JSON 文件可以很好地解决这个问题。如果您使用 XML System.Linq.Xml
(与 相比,它具有更好和现代的 API System.Xml
),您仍然可以使用 XML - 只需将我的使用替换为JsonConvert
一些 XML 反序列化库或您自己的 XML 阅读代码。
创建一个
.json
包含详细信息的文件:{ "contacts": [ { "name": "Luke Skywalker", "email" : "luke@degobah.com", }, { "name": "Anakin SkyWalker", "email" : "whiner@deathstar.com", }, // etc ] }
创建对文件中的数据进行建模的 C# POCO 类型:
class ContactsFile { public List<Contact> Contacts { get; set; } } class Contact { public String Name { get; set; } public String Email { get; set; } public String Phone { get; set; } }
在您的应用程序的某处阅读它:
我假设数据会被定期编辑,所以你应该在每次使用它时重新加载它——在这种情况下,你应该为它创建一个新的可注入服务类,就像这样。请注意,您不需要接口(但它对测试很有用)。
public interface IContactsStore
{
Task<ContactsFile> ReadAsync();
}
public class DefaultContactsStore : IContactsStore
{
private readonly IHostingEnvironment env;
public DefaultContactsStore(IHostingEnvironment env)
{
this.env = env;
}
public async Task<ContactsFile> ReadAsync()
{
String path = Path.Combine( this.env.ContentRootPath, "Contacts.json" );
String fileContents;
using( StreamReader rdr = new StreamReader( path ) )
{
fileContents = await rdr.ReadToEndAsync();
}
return JsonConvert.DeserializeObject<ContactsFile>( fileContents );
}
}
public class MyController : Controller
{
private readonly IContactsStore contactsStore;
public MyController( IContactsStore contactsStore )
{
this.contactsStore = contactsStore;
}
[Route("/contacts")]
public async Task<IActionResult> ListContacts()
{
ContactsFile cf = await this.contactsStore.ReadAsync();
return this.View( model: cf );
}
}
// In Startup.cs:
public void ConfigureService( ... )
{
// etc
services.AddSingleton<IContactsStore,DefaultContactsStore>();
// etc
}
推荐阅读
- javascript - 播放器无法在加载时自动播放
- javascript - 在 react.js 中克隆后内联事件处理程序不起作用
- java - 拉链三个不同类型的不同单声道
- bash - 在脚本中捕获脚本的 Ctrl-C
- swiftui - 列表视图预先创建所有详细视图
- c - 如何解决哈希时发生的这个 malloc 错误
- python - Discord.py,bot 不播放任何 mp3 文件
- kubernetes - “yq”的未知命令“.network.genesisProfile”
- linux - 如何在 Linux 服务器上使用 pm2 运行 asp.net 核心应用程序
- jupyter - 没有标签的 JupyterLab 自动完成