after calling to app = injector.create<App>(); the APP constructor is called 1 time but its destructor is called 4 times?why?
shaharMatmon opened this issue · 0 comments
Expected Behavior :
App : CTOR for 1 time
Actual Behavior :
Algo : CTOR for 1 time
FeCommParser : CTOR for 1 time
FeMessagesReceiver : CTOR for 1 time
FeMonitor : CTOR for 1 time
SystemManager : CTOR for 1 time
Successfully opened Uart port !
Successfully opened Uart port !
ErrorsManager : CTOR for 1 time
SingleEventSync : CTOR for 1 time
MessagesManager : CTOR for 1 time
SingleEventSync : CTOR for 2 time
CommandsExecuter : CTOR for 1 time
BinaryParser : CTOR for 1 time
CommandsFactory : CTOR for 1 time
CommandsManager : CTOR for 1 time
HostCommManager : CTOR for 1 time
BackEndManager : CTOR for 1 time
App : CTOR for 1 time
App : DTOR for 1 time
App : DTOR for 2 time
App : DTOR for 3 time
App : DTOR for 4 time
Steps to Reproduce the Problem :
class IAlgo
{
public:
virtual void Start() = 0;
};
class Algo : public IAlgo
{
public:
Algo();
~Algo();
virtual void Start() override;
};
class ISystemManager
{
public:
virtual std::shared_ptr& GetHostCommDevice() = 0;
virtual std::shared_ptr& GetFeCommDevice() = 0;
};
class SystemManager : public ISystemManager
{
public:
SystemManager();
~SystemManager();
virtual std::shared_ptr<ICommDevice>& GetHostCommDevice() override;
virtual std::shared_ptr<ICommDevice>& GetFeCommDevice() override;
private:
std::shared_ptr m_pHostCommDevice;
std::shared_ptr m_pFrontEndCommDevice;
};
class IHostCommManager
{
public:
virtual void Start() = 0;
virtual void SetStream(std::shared_ptr& stream) = 0;
virtual void BuildCommands(CommandsExecutionProvider& cmdProviderExecuter,
std::shared_ptr preProcessingData,
std::shared_ptr rawEegAndProcVarsManger) = 0;
virtual IMessagesManager& GetMsgManager() = 0;
};
class HostCommManager : public IHostCommManager
{
public:
HostCommManager(IMessagesManager& msgManager, ICommandsManager& cmdManager);
virtual ~HostCommManager();
virtual void Start() override;
virtual void SetStream(std::shared_ptr<Istream>& stream) override;
virtual void BuildCommands(CommandsExecutionProvider& cmdProviderExecuter, std::shared_ptr<PreProcessingDataSimulator> preProcessingData,
std::shared_ptr<RawEEGandProcsVarManger> rawEegAndProcVarsManger) override;
//TODO : To remove
virtual IMessagesManager& GetMsgManager() override;
private:
ICommandsManager& m_cmdManager;
IMessagesManager& m_msgManager;
std::shared_ptr m_hostStream;
};
class IBackEndManager
{
protected:
//virtual ~IBackEndManager() = 0;
public:
virtual void Start() = 0;
virtual void StartPowerTestResult() = 0;
virtual void StartConfigData() = 0;
virtual void StartRevisionInfo() = 0;
virtual void StartHardwareInfo() = 0;
virtual void StartSetHostFilters() = 0;
virtual void StartOperatingEnvironment() = 0;
virtual void StartSetSmoothingRates() = 0;
virtual void StartProcessedVars() = 0;
virtual void StartScrEeg() = 0;
virtual void StartRawEeg() = 0;
virtual void StartErrorsSolicited() = 0;
virtual void StartGroundCheck() = 0;
virtual void StartSensorCheck() = 0;
virtual void StartSendTimeDate() = 0;
virtual void StartPerformImpedanceMeasurements() = 0;
virtual void StopPerformImpedanceMeasurements() = 0;
virtual void StartSendArtifactFileHeader() = 0;
virtual void StartSendProcVarsLabels() = 0;
virtual void BuildCommands(CommandsExecutionProvider& cmdProviderExecuter, std::shared_ptr<PreProcessingDataSimulator> preProcessingData,
std::shared_ptr<RawEEGandProcsVarManger> rawEegAndProcVarsManger) = 0;
virtual IMessagesManager& GetMsgManager() = 0;
};
class BackEndManager : public IBackEndManager
{
public:
BackEndManager(IHostCommManager& hostComm, ISystemManager& systemManager, FeMonitor& feMonitor, IAlgo& algo);
virtual ~BackEndManager();
// IBackEndManager Interface
virtual void Start() override;
virtual void BuildCommands(CommandsExecutionProvider& cmdProviderExecuter, std::shared_ptr<PreProcessingDataSimulator> preProcessingData,
std::shared_ptr<RawEEGandProcsVarManger> rawEegAndProcVarsManger) override;
virtual IMessagesManager& GetMsgManager() override;
virtual void StartGroundCheck() override;
virtual void StartSensorCheck() override;
virtual void StartPowerTestResult() override;
virtual void StartConfigData() override;
virtual void StartRevisionInfo() override;
virtual void StartHardwareInfo() override;
virtual void StartSetHostFilters() override;
virtual void StartOperatingEnvironment() override;
virtual void StartSetSmoothingRates() override;
virtual void StartProcessedVars() override;
virtual void StartScrEeg() override;
virtual void StartRawEeg() override;
virtual void StartErrorsSolicited() override;
virtual void StartSendTimeDate() override;
virtual void StartPerformImpedanceMeasurements() override;
virtual void StopPerformImpedanceMeasurements() override;
virtual void StartSendArtifactFileHeader() override;
virtual void StartSendProcVarsLabels() override;
virtual std::shared_ptr<Istream>& GetHostCommStream();
virtual std::shared_ptr<Istream>& GetFeCommStream();
private:
IHostCommManager& m_hostComm;
ISystemManager& m_sysManager;
IAlgo& m_algo;
//IFrontEnd& m_frontEnd;
FeMonitor& m_feMonitor;
};
class App
{
public:
App(IBackEndManager& bem);
~App();
void Start(int argc, const char* const argv[]);
private:
IBackEndManager& m_beManager;
CommandsExecutionProvider* m_cmdExeProvider;
};
auto injector = di::make_injector(
di::bind<IBackEndManager>().to<BackEndManager>(), // bind interface to implementation
di::bind<IAlgo>().to<Algo>(),
di::bind<ISystemManager>().to<SystemManager>(),
di::bind<IHostCommManager>().to<HostCommManager>(),
di::bind<IMessagesManager, IReturnAcknowledge>().to<MessagesManager>(),
di::bind<ICommandsManager>().to<CommandsManager>(),
di::bind<IBinaryParser>().to<BinaryParser>(),
di::bind<ICommandsExecuter>().to<CommandsExecuter>(),
di::bind<IErrorsManager>().to<ErrorsManager>(),
di::bind<IMessageReceiver>().to<FeMessagesReceiver>(),
di::bind<IFeCommMessageFactory>().to<FeCommMessageFactory>()
);
App app = injector.create<App>();
Specifications
- Version:
- Platform:
- Subsystem: