我在哪里可以将经常更改的联系信息保留在Asp.Net Core项目中,以便可以对其进行更新(如配置文件)

时间:2019-05-08 17:32:36

标签: 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的新功能中丢失了。实施这种方法的首选方法是什么?

1 个答案:

答案 0 :(得分:1)

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

否则,JSON文件将对此非常有用。如果您使用System.Linq.Xml(与System.Xml相比具有更好的现代API),您仍然可以使用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
    }