powered by simpleCommunicator - 2.0.35     © 2025 Programmizd 02
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Как модифицировать код, чтобы решить задачу? (DI, .Net Core)
9 сообщений из 9, страница 1 из 1
Как модифицировать код, чтобы решить задачу? (DI, .Net Core)
    #40060416
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть Nuget пакет провайдер смс. Но редактировать его нежелательно, хоть и есть исходнник.
Мое приложение использует этот пакет.
Когда пользователь был один, все было хорошо - креденшелы (логин и пароль) были одни для всех юзеров и брались из apppsettings (секция BVBSMSGateOptions).
Сейчас условия изменились - теперь у каждого юзера есть свой логин и пароль.
И теперь их надо передавать в каждом запросе.

Ниже приведу код, который работал с одними кредами на всех пользователей (рабочий метод SendSms , креды в BSMSGateOptions ):
SMSProviders package
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
// SMSProviders package begin
    
	namespace SMSProviders.Abstract
	{
		public interface ISMSGate
		{
			Task<ResponseSendMessage> SendSms(string phone, string message);
		}
	}
	
	namespace SMSProviders.BVB.Options
	{
		public class BSMSGateOptions
		{
			public string Url { get; set; }
			public string Login { get; set; }
			public string Password { get; set; }
		}
	}	
	
	namespace SMSProviders.BVB.Extensions
	{
		public static class DIExtensions
		{
			public static IServiceCollection AddBVBSMSGate(this IServiceCollection services, IConfiguration config) 
			{
				services.Configure<BVBSMSGateOptions>(config);
				services.AddSingleton<ISMSGate, BSMSGate>();
				return services;
			}
		}
	}
	
	namespace SMSProviders.BVB
	{	
		public class BSMSGate : ISMSGate
		{
			private readonly ILogger<BSMSGate> _logger;
			private readonly BSMSGateOptions _bOptions;
			private readonly IHttpClientFactory _httpClientFactory;

			public BSMSGate(IHttpClientFactory httpClientFactory
						   ,IOptions<BSMSGateOptions> bOptions
						   ,ILogger<BSMSGate> logger)
			{
				_httpClientFactory = httpClientFactory;
				_bOptions = bOptions.Value;
				_logger = logger;
			}
			
			public async Task<ResponseSendMessage> SendSms(string phone, string message)
			{ .... 
				// внутри происходит инициализация кредов (_bOptions) и отправка смс по кредам		
			 ....
			}
			
		}
	}	
	
// SMSProviders package end




MyService
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
// Project  "MyService" begin

namespace MyService
{
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            ....
            services.AddBVBSMSGate(_configuration.GetSection("BVBSMSGateOptions"));
            ....
        }
         .....
    }

}

namespace MyService.Controllers
{
    [ApiController]
    [Route("[controller]/[action]")]
    public class ApiController : ControllerBase
    {
        private readonly ISMSGate _smsGate;
        private readonly ILogger<ApiController> _logger;

        public ApiController(ISMSGate smsGate,ILogger<ApiController> logger)
        {
            _smsGate = smsGate;
            _logger = logger;
        }

        public async Task<ActionResult<Response_Sms>> Send_Sms(Request_SmsModel requestSmsModel)
        {
		....
                    try
                    {
                        // вот тут мне надо перед отправкой СМС указать от какого пользователя оно отправляется
                        response = await _smsGate.SendSms(phoneNumber, messageSms);
                    }
                    catch (Exception e)
                    {
                        return new Response_Sms(....);
                    }		
		....
		}

}
// Project "MyService" end




Вопрос:
как мне теперь инитить юзер-кредам каждый запрос?


Спасибо за помощь с кусочком кода.
...
Рейтинг: 0 / 0
Как модифицировать код, чтобы решить задачу? (DI, .Net Core)
    #40060465
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a) передавать их в качестве параметра метод SendSms
б) для каждого пользователя создать свою службу
в) создавать её при каждой отправке сообщения и потом разрушать
...
Рейтинг: 0 / 0
Как модифицировать код, чтобы решить задачу? (DI, .Net Core)
    #40060472
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes
a) передавать их в качестве параметра метод SendSms

придется редактировать нугет.

Roman Mejtes

б) для каждого пользователя создать свою службу

расточительно

Roman Mejtes

в) создавать её при каждой отправке сообщения и потом разрушать

здесь подробнее можно?
...
Рейтинг: 0 / 0
Как модифицировать код, чтобы решить задачу? (DI, .Net Core)
    #40060536
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
services.AddBVBSMSGate посмотри исходники этого метода
...
Рейтинг: 0 / 0
Как модифицировать код, чтобы решить задачу? (DI, .Net Core)
    #40060585
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у тебя ж полюбас врапер есть над библой чтоб абстрагировать код от реализации. вот ты там можешь без редактирования нугета и дописать логику прокидывания учетки и отправку уже через нугет библу.
...
Рейтинг: 0 / 0
Как модифицировать код, чтобы решить задачу? (DI, .Net Core)
    #40060628
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
весь код вызова SendSms я привел в ТС.
нет там враппера.
сходимся на том, что надо просто для каждого вызова подкладывать креды и создавать новый экземпляр.

я правильно понимаю, что мне надо тут заменить AddSingleton на AddTransient ?
Код: c#
1.
2.
3.
4.
5.
6.
			public static IServiceCollection AddBVBSMSGate(this IServiceCollection services, IConfiguration config) 
			{
				services.Configure<BVBSMSGateOptions>(config);
				services.AddSingleton<ISMSGate, BSMSGate>();
				return services;
			}
...
Рейтинг: 0 / 0
Как модифицировать код, чтобы решить задачу? (DI, .Net Core)
    #40060630
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes
services.AddBVBSMSGate посмотри исходники этого метода

вот они
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
	namespace SMSProviders.BVB.Extensions
	{
		public static class DIExtensions
		{
			public static IServiceCollection AddBVBSMSGate(this IServiceCollection services, IConfiguration config) 
			{
				services.Configure<BVBSMSGateOptions>(config);
				services.AddSingleton<ISMSGate, BSMSGate>();
				return services;
			}
		}
	}
...
Рейтинг: 0 / 0
Как модифицировать код, чтобы решить задачу? (DI, .Net Core)
    #40060704
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RegisteredUser,

Теперь почитай вот это
https://metanit.com/sharp/aspnet5/6.2.php
и посмотри на этот метод еще раз, а сделай свой, с блекджеком, логином и паролем
...
Рейтинг: 0 / 0
Как модифицировать код, чтобы решить задачу? (DI, .Net Core)
    #40063964
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
кому интересно, решили так:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
namespace MyService.Controllers
{
    [ApiController]
    [Route("[controller]/[action]")]
    public class ApiController : ControllerBase
    {
        private readonly ISMSGate _smsGate;
        private readonly ILogger<ApiController> _logger;
        private readonly IHttpClientFactory _httpClientFactory;
        private readonly ILogger<BSMSGate> _loggerB;

        public ApiController(ISMSGate smsGate,ILogger<ApiController> logger,
							 IHttpClientFactory httpClientFactory, ILogger<BSMSGate> loggerB)
        {
            _smsGate = smsGate;
            _logger = logger;
            _httpClientFactory = httpClientFactory;
            _loggerB = loggerB;			
        }

        public async Task<ActionResult<Response_Sms>> Send_Sms(Request_SmsModel requestSmsModel)
        {
		....
                    try
                    {
                        // вот тут мне надо перед отправкой СМС указать от какого пользователя оно отправляется
                        //response = await _smsGate.SendSms(phoneNumber, messageSms);
						
						//решение вопроса:

						var bSMSGate = new BSMSGate(_httpClientFactory,
							Options.Create(new BSMSGateOptions()
							{
								Login = "login",
								Password = "password",
								Url = "https://poewfpewof.com"
							}),
							_loggerB);


							bSMSGate.SendSms("+123456789", "Test sms");						
						}
                    catch (Exception e)
                    {
                        return new Response_Sms(....);
                    }		
		....
		}

}
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Как модифицировать код, чтобы решить задачу? (DI, .Net Core)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]