общие службы в ядре asp.net со страницами бритвы - PullRequest
0 голосов
/ 02 января 2019

Для справки, у меня есть общая BasePageModel, которая наследует PageModel.

У меня также есть несколько служб, которые я ВСЕГДА буду использовать:

  1. UserManager<AppUser> userManager
  2. IHttpContextAccessor httpContextAccessor
  3. IHostingEnvironment env

Есть ли способ ВСЕГДА вводить их, чтобы мне не приходилось делать инъекцию в конструктор для каждой из этих служб в каждойСтраница бритвы?

1 Ответ

0 голосов
/ 02 января 2019

В общем, вы можете определить сервис для внедрения в каждое представление, используя _ViewImports.cshtml.Просто добавьте туда свою инъекцию представлений, и служба будет доступна для каждого представления.

Однако вам не следует делать это с любой из трех служб, которые вы прямо упомянули.Во-первых, IHttpContextAccessor не является необходимым, поскольку вы можете получить HttpContext в вашем представлении через ViewContext.HttpContext.Аналогично, IHostingEnvironment также в основном не требуется, поскольку вы можете использовать помощник по тегам environment:

<environment include="Development">
    <p>This is development.</p>
</environment>
<environment exclude="Development">
    <p>This is production.</p>
</environment>

Для UserManager<AppUser> такой сервис лучше включать только тогда, когда он действительно вам нужен.Если вы обнаружите, что снова и снова используете одну и ту же логику, требуя эту услугу, рассмотрите возможность создания помощника по тегам или компонента представления вместо того, чтобы инкапсулировать эту логику таким образом, чтобы вы могли использовать ее в нескольких местах, не добавляя ничего особенного в ваше представление.

И наконец, поскольку основной темой этого обсуждения было главным образом не отправлять электронную почту в процессе разработки, лучшим подходом является просто замена SMTP-сервера на что-то локальное в разработке.Есть приложение под названием Papercut , которое с открытым исходным кодом и бесплатно и делает отправку / получение электронной почты в процессе разработки на одном дыхании.По умолчанию он будет привязан к localhost: 25, поэтому вам просто нужно поменять с ним ваше реальное SMTP-соединение.Например, вы можете создать раздел в вашем appsettings.json, например:

"Smtp": {
  "Host": "localhost",
  "Port": 25,
  "EnableSsl": false,
  "Username": "",
  "Password": ""
}

Затем при запуске:

services.AddSingleton(_ => {
    var config = Configuration.GetSection("Smtp").Get<SmtpConfig>();
    return new SmtpClient
    {
        Host = config.Host,
        Port = config.Port,
        EnableSsl = config.EnableSsl,
        Credentials = new NetworkCredential(config.Username, config.Password)
    };
});

Затем просто введите SmtpClient в свою электронную почту.обслуживание, и вы отправляетесь в гонки.В производственной среде вы можете использовать переменные среды или хранилище ключей Azure для изменения настроек производственного SMTP-соединения.Для этого лучше не использовать appsettings.json (или appsettings.Production.json), так как вы, скорее всего, не захотите фиксировать его в вашем контроле исходного кода.

...