Как использовать сервис, объявленный на Startup.cs вне контроллеров - PullRequest
0 голосов
/ 29 октября 2019

Я разрабатываю веб-приложение с использованием ядра ASP.net, я новичок в этой технологии.

Я использую службу для отправки писем, вот класс:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Extensions.Options;
using System.Net.Mail;




namespace WebApplication.Services
{

    public class MessageSender : IEmailSender, ISmsSender
    {
        public MessageSender(IOptions<MessageSenderOptions> optionsAccessor)
        {
            Options = optionsAccessor.Value;
        }

        public MessageSenderOptions Options { get; } //set only via Secret Manager

        public Task SendEmailAsync(string email, string subject, string message)
        {
            // Plug in your email service here to send an email.

            using (var smtp = new SmtpClient(Options.emailServer))
            {
                var mail = new MailMessage
                {
                    Subject = subject,
                    IsBodyHtml = true,
                    From = new MailAddress(Options.fromEmail, Options.fromName),
                    Body = message
                };

                if (Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") != "Development")
                {
                    mail.To.Add(email);
                }
                else
                {

                    mail.To.Add("test@gmail.com");
                }



                smtp.Send(mail);
            }

            return Task.FromResult(0);
        }

        public Task SendSmsAsync(string number, string message)
        {
            // Plug in your SMS service here to send a text message.
            return Task.FromResult(0);
        }
    }
    public class MessageSenderOptions
    {
        public List<string> emails { get; set; }
        public string emailServer { get; set; }
        public string fromEmail { get; set; }
        public string fromName { get; set; }


    }

}

И я называю это в моем контроллере следующим образом:

namespace WebApplication.Controllers
{
    [Route("api/[controller]")]
    public class MyController : Controller
    {

        private readonly Context _Context;
        private IHostingEnvironment _environment;
        private ILogger<MyController> _logger;
        private MessageSender _messageSender;

        public MyController(IOptions<RegistrarConnection> optionsAccessor,
            Context dbContextd,
            IHostingEnvironment environment,
            ILogger<GestionAteliersController> logger,
            MessageSender messageSender,

            )
        {
            Options = optionsAccessor.Value;

            _Context = dbContextd;
            _environment = environment;
            _logger = logger;
            _messageSender = messageSender;

        }

  [Route("[action]")]
        public IActionResult save([FromBody] Obj obj)
        {
            try

            {
                //code
                string subjet = "Subject";

                string message = "Message";

                _messageSender.SendEmailAsync("test@gmail.ca", subjet, message);

                var v = new { result = "OK" };

                return this.Ok(v);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex.ToString());
                return new BadRequestObjectResult("Error");
            }
        }


Это просто часть метода, и все работает нормально.

Проблема, которая у меня сейчас есть, заключается в том, что я хочучтобы вызвать этот метод

_messageSender.SendEmailAsync("test@gmail.ca", subjet, message);

за пределами контроллера, в другом классе, и я не знаю, как использовать его, как легко сделать контроллер.

Я не понимаю, как он используетконструктор класса MessageSender .

В файле Startup.cs эта часть кода содержится в методе ConfigureServices :

services.Configure<MessageSenderOptions>(Configuration.GetSection("MessageSenderOptions"));

            services.AddTransient<IEmailSender, MessageSender>();
            services.AddTransient<ISmsSender, MessageSender>();
            services.AddTransient<MessageSender, MessageSender>();

И в моем файле appsettings.json есть эта часть кода:

"MessageSenderOptions": {
    "emailServer": "smtp.gmail.ca",
    "emails": [
      "test@gmail.ca"
    ],
    "fromEmail": "abb@gmail.ca",
    "fromName": "Test"
  }

Так что я предполагаю, что каким-то образом, когда вызывается конструктор mycontroller, это как если бы эта строка выполняла всю работу:

_messageSender = messageSender; Вызывая конструктор MessageSender и использование параметра IOptions из файла appsettings.json .

Но я не знаю, как это использовать вдругой класс:

 public class HelloJob : IJob
    {
        /*private readonly ILogger _logger;
        */
        private MessageSender _messageSender;

        _messageSender.SendEmailAsync("test@gmail.ca", subjet, message);

}

Как создать экземпляр MessageSender , используя параметры appsettings.json , используемые в Startup.cs для вызоваметод SendEmailAsync

Спасибо за помощь

1 Ответ

1 голос
/ 29 октября 2019

Проверьте этот URL https://docs.microsoft.com/fr-fr/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-3.0

Вам нужно передать экземпляр вашего класса в вашем конструкторе

public class HelloJob : IJob
{
    private readonly MessageSender _messageSender;

    public HelloJob(MessageSender messageSender)
    {
        _messageSender = messageSender;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...