Где я могу хранить часто меняющуюся контактную информацию в своем проекте Asp.Net Core, чтобы я мог ее обновить (например, файл конфигурации) - PullRequest
1 голос
/ 08 мая 2019

У старых проектов 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.Каков предпочтительный метод реализации чего-то подобного?

1 Ответ

1 голос
/ 08 мая 2019

В идеале, файл базы данных - вы можете использовать простую базу данных sqlite, если хотите.

В противном случае файл JSON отлично подойдет для этого. Вы также можете по-прежнему использовать XML, если используете System.Linq.Xml (который имеет гораздо более приятный и современный API по сравнению с System.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
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...