boost-ext/di

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: