AddTransient или AddScoped для отдельного контроллера isntance для каждого слушателя в. net базовое приложение ядра - PullRequest
0 голосов
/ 05 августа 2020

Я разместил asp. net kesterl внутри приложения фоновой службы и запустил несколько экземпляров на разных портах одного и того же управляемого объекта с некоторыми конкретными c объектами. Я хочу, чтобы, если когда-либо произойдет попадание в контроллер, следует использовать параметр, который я передал при начальной инициализации. своего рода отдельный экземпляр контроллера для каждого списка. В целях тестирования я пробовал Singleton, но в результате получился единственный экземпляр. Теперь я проверяю, какой тип экземпляра (AddScoped или AddTransient) мне следует использовать в моем сценарии и как я могу ввести параметр во время этого.

Моя текущая база кода выглядит как

    internal static IHostBuilder CreateHostBuilder(string listener, CommunicationChannelElement communicationChannelElement)
            {
//here i want how i can use addScoped or AddTransient with communication paramter
                return Host.CreateDefaultBuilder().ConfigureServices(services => services.AddSingleton(communicationChannelElement)).
                ConfigureWebHostDefaults(webBuilder => webBuilder.UseUrls(listener).
                UseStartup<Startup>());
            }
            
            
            
            
            private void StartBackGroundWebListener(CommunicationChannelElement communicationChannelElement)
            {            
               CreateHostBuilder(_objSettings, communicationChannelElement).Build().Run();//separate thread  using task parallel library          
            }
            
            
            public void StartAll()
            {
                    StartBackGroundWebListener("http://10.1.2.3:0001",communicationChannelElement1);
            
                    StartBackGroundWebListener("http://10.1.2.3:0002",communicationChannelElement2);
            
                    StartBackGroundWebListener("http://10.1.2.3:0003",communicationChannelElement3);
            }
            
            
            
            public class CallBackController : ControllerBase
            {        
    
                    private readonly CommunicationChannelElement CommunicationChannelElement;
    
                    public CallBackController(CommunicationChannelElement communicationChannelElement)
                    {
                        CommunicationChannelElement = communicationChannelElement;
                    }               
                ... 
                    
            }

1 Ответ

0 голосов
/ 05 августа 2020

Добились этого с помощью следующего кода

public class CallBackController : ControllerBase
    {
        private readonly CommunicationChannelElement CommunicationChannelElement;
        public CallBackController(IServiceProvider serviceProvider)
        {
            CommunicationChannelElement = serviceProvider.GetService<CommunicationChannelElement>();
        }
        
        ....
}
  
  
  internal static IHostBuilder CreateHostBuilder(string listner, CommunicationChannelElement communicationChannelElement)
  {
            return Host.CreateDefaultBuilder().ConfigureServices(services => services.AddTransient(ctx => communicationChannelElement)).
              ConfigureWebHostDefaults(webBuilder => webBuilder.UseUrls(listner).UseStartup<ComvivaStartup>());

            //return Host.CreateDefaultBuilder().ConfigureServices(services => services.AddSingleton(communicationChannelElement)).
            //  ConfigureWebHostDefaults(webBuilder => webBuilder.UseUrls(listner).UseStartup<ComvivaStartup>());
  }

, если требуется какое-либо улучшение, дайте мне знать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...