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的新功能中丢失了。实施这种方法的首选方法是什么?
答案 0 :(得分:1)
理想情况下,是一个数据库文件-如果愿意,您可以使用一个简单的sqlite数据库。
否则,JSON文件将对此非常有用。如果您使用System.Linq.Xml
(与System.Xml
相比具有更好的现代API),您仍然可以使用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
}