Я новичок в системе сигнализации и только что узнал о внедрении 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();
}
}