首页 > 解决方案 > 我在哪里可以在我的 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 的新热点中缺少 。实现这样的事情的首选方法是什么?

标签: c#asp.net-core

解决方案


理想情况下,一个数据库文件——如果你愿意,你可以使用一个简单的 sqlite 数据库。

否则,JSON 文件可以很好地解决这个问题。如果您使用 XML System.Linq.Xml(与 相比,它具有更好和现代的 API System.Xml),您仍然可以使用 XML - 只需将我的使用替换为JsonConvert一些 XML 反序列化库或您自己的 XML 阅读代码。

  1. 创建一个.json包含详细信息的文件:

    {
        "contacts": [
            {
                "name": "Luke Skywalker",
                "email" : "luke@degobah.com",
            },
            {
                "name": "Anakin SkyWalker",
                "email" : "whiner@deathstar.com",
            },
            // etc
        ]
    }
    
  2. 创建对文件中的数据进行建模的 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; }
    }
    
  3. 在您的应用程序的某处阅读它:

我假设数据会被定期编辑,所以你应该在每次使用它时重新加载它——在这种情况下,你应该为它创建一个新的可注入服务类,就像这样。请注意,您不需要接口(但它对测试很有用)。

    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
    }

推荐阅读