Приложение SignalR winforms, использующее autofa c, не показывает формы - PullRequest
0 голосов
/ 18 июня 2020

Я новичок в системе сигнализации и только что узнал о внедрении autofac / зависимости. У меня есть решение, в котором есть сервер с хабом, клиентом и некоторыми общими библиотеками.

Решение работало нормально с запуском форм, запуском сервера и подключением клиента. Я столкнулся с проблемой перезапуска сервера, что привело меня в кроличью нору зависимости. Я начал пытаться использовать autofa c для изучения / реализации DI, но теперь нет форм для запуска сервера и клиента, но решение работает без ошибок.

Я застрял и не знаю, как устранить неполадки, чтобы найти почему.

структура моего серверного приложения

Программа (точка входа) IApplication (интерфейс для пользовательского класса приложения) Application ContainerConfig (CClass, который хранит autofa c config) IFrmServer ( интерфейс для класса формы) FrmServer

вот классы на сервере

каждый - свой класс

namespace Beacon.Server
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            //Application.EnableVisualStyles();
            //Application.SetCompatibleTextRenderingDefault(false);

            //load config into a variable
            var container = ContainerConfig.Configure();

            //define the scope of the application
            using (var scope = container.BeginLifetimeScope())
            {
                //resolve the application to the custom Interface that has been created
                //this removes the application from the startup
                var app = scope.Resolve<IApplication>();

                app.Run();
            }

        }

    }
}


    namespace Beacon.Server
{
    public class Application : IApplication
    {
        IFrmServer _frmServer;
        public Application(IFrmServer frmServer)
        {
            _frmServer = frmServer;
        }

        public void Run()
        {
            //initialize new instance of beacon DB in order to register to Hub Events
            TRS_BeaconDB _BeaconDB = new TRS_BeaconDB();

            _frmServer.Startup();
        }
    }
}


namespace Beacon.Server
{
    public static class ContainerConfig
    {
        public static IContainer Configure()
        {
            var builder = new ContainerBuilder();

            //register any classes to their Interfaces
            builder.RegisterType<Application>().As<IApplication>();
            builder.RegisterType<PacketManager>().As<IPacketManager>();
            //builder.RegisterType<FrmServer>().As<IFrmServer>().SingleInstance();            

            // Using a TYPED parameter:
            builder.RegisterType<FrmServer>()
                   .As<IFrmServer>()
                   .WithParameter(new TypedParameter(typeof(string), "packetManager"));

            return builder.Build();
        }
    }
}



namespace Beacon.Server
{
    public partial class FrmServer : Form, IFrmServer
    {
        private IDisposable _signalR;
        private BindingList<ClientItem> _clients = new BindingList<ClientItem>();
        private BindingList<string> _groups = new BindingList<string>();
        private BindingList<string> _requestTypes = new BindingList<string>();

        IPacketManager _packetManager;


        public FrmServer(IPacketManager packetManager)
        {
            _packetManager = packetManager;


            InitializeComponent();


            bindListsToControls();
            //Register to static hub events
            TRS_Hub.ClientConnected += TRSHub_ClientConnected;
            TRS_Hub.ClientReconnected += TRSHub_ClientReconnected;
            TRS_Hub.ClientDisconnected += TRSHub_ClientDisconnected;
            TRS_Hub.ClientNameChanged += TRSHub_ClientNameChanged;
            TRS_Hub.ClientJoinedToGroup += TRSHub_ClientJoinedToGroup;
            TRS_Hub.ClientLeftGroup += TRSHub_ClientLeftGroup;
            TRS_Hub.MessageReceived += TRSHub_MessageReceived;
            TRS_Hub.RequestReceived += TRSHub_RequestReceived;
            TRS_Hub.HeartbeatReceived += TRSHub_HeartbeatReceived;
        }

        private void bindListsToControls()
        {
            //Clients list
            cmbClients.DisplayMember = "Name";
            cmbClients.ValueMember = "Id";
            cmbClients.DataSource = _clients;

            //Groups list
            cmbGroups.DataSource = _groups;

            //requests list
            _requestTypes.Add("Request Client IP Address");
            _requestTypes.Add("Request Client Alive");
            _requestTypes.Add("Request Client Add Numbers");
            _requestTypes.Add("Request Data");

            cmbRequests.DataSource = _requestTypes;

            //Bind the task list to the grid view
            TaskManager _manager = new TaskManager();
            grdTaskList.DataSource = _manager._taskList;
        }

        public void Startup()
        {
            try
            {
                //Start SignalR server with the give URL address
                //Final server address will be "URL/signalr"
                //Startup.Configuration is called automatically
                _signalR = WebApp.Start<Startup>(txtUrl.Text);


                writeToLog($"Server started at:{txtUrl.Text}");
                FileLogger.Info($@"{DateTime.Now} : Application Started");

            }
            catch (Exception ex)
            {
                writeToLog($"Server unable to start:{ex.InnerException}");
                FileLogger.Info($@"Server unable to start:{ex.InnerException}");

            }
        }

    }
}

если есть какой-либо другой код, который мне нужно показать или другие детали, пожалуйста, дайте мне знать

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

Ура

ИЗМЕНИТЬ ******

Я забыл включить класс запуска для концентратора

    class Startup
{
    //below methos works but has an issue with dependancy
    //specifically when the server restarts the client cannot find it
    //this is because there is no dependancy resolution code to handle these events

    //create signalr config on startup
    public void Configuration(IAppBuilder app)
    {
        //CORS need to be enabled for calling SignalR service 
        app.UseCors(CorsOptions.AllowAll);
        //Find and reigster SignalR hubs
        //By default SignalR uses GlobalHost, which is a singleton resolver. When disposed, it will never come back.
        //When creating the configuration for the hub, you should pass inn a new dependency resolver:
        //var hubConfiguration = new HubConfiguration { Resolver = new DefaultDependencyResolver() };
        //app.MapSignalR(hubConfiguration);

        app.MapSignalR();

    }



}

1 Ответ

0 голосов
/ 19 июня 2020

Несколько указателей:

  1. похоже, что _frmServer.Show () отсутствует в Application.Run, который отвечает за отображение пользовательского интерфейса формы
  2. хостинг требует прав администратора, если URL-адрес не указан добавлен в список управления доступом URL
  3. Я не вижу какой-либо конфигурации концентратора сигнализатора, возможно, она доступна в классе запуска, и ее просмотр даст больше идей.

Если вы думаете о форме. show не требуется, тогда объект, созданный из WebApp.Start, не следует удалять, чтобы обеспечить успешный хостинг. если посмотреть на код, то выглядит, что объект формы удален, следовательно, хостинг также прекращен.

...