-
Notifications
You must be signed in to change notification settings - Fork 152
Open
Description
When using a factory of the object which has shared dependency, factory recreates it, which brakes "singleton" pattern.
here is the output
class singleton 015E8250
class use_singleton_one using singleton 015E8250
class example using singleton 015E8250
class singleton 015E5FA8
class use_singleton_one using singleton 015E5FA8
class use_singleton using singleton 015E5FA8
class use_singleton_one using singleton 015E5FA8
class use_singleton using singleton 015E5FA8
class use_singleton_one using singleton 015E5FA8
class use_singleton using singleton 015E5FA8
class example using singleton 015E8250of the following code
#include <iostream>
#include "boost/di.hpp"
#include "boost/di/extension/injections/factory.hpp"
namespace di = boost::di;
class singleton {
public:
singleton()
{
std::cout << typeid(*this).name();
std::cout << " ";
std::cout << this;
std::cout << std::endl;
}
};
class use_singleton_one {
public:
use_singleton_one(std::shared_ptr<singleton> s)
{
std::cout << typeid(*this).name();
std::cout << " using singleton ";
std::cout << s;
std::cout << std::endl;
}
};
class use_singleton_correct_another {
public:
use_singleton_correct_another(std::shared_ptr<singleton> s)
{
std::cout << typeid(*this).name();
std::cout << " using singleton ";
std::cout << s;
std::cout << std::endl;
}
};
class use_singleton {
public:
use_singleton(std::shared_ptr<singleton> s, std::unique_ptr<use_singleton_one> us)
{
std::cout << typeid(*this).name();
std::cout << " using singleton ";
std::cout << s;
std::cout << std::endl;
}
};
class example {
public:
example(std::shared_ptr<singleton> s, std::shared_ptr<di::extension::ifactory<use_singleton>> f, std::unique_ptr<use_singleton_one> s2)
{
std::cout << typeid(*this).name();
std::cout << " using singleton ";
std::cout << s;
std::cout << std::endl;
auto ss = f->create();
auto ss2 = f->create();
auto ss3 = f->create();
std::cout << typeid(*this).name();
std::cout << " using singleton ";
std::cout << s;
std::cout << std::endl;
}
};
int main()
{
auto injector = di::make_injector(
di::bind<di::extension::ifactory<use_singleton>>().to(di::extension::factory<use_singleton>{})
);
auto e = injector.create<example>();
}Metadata
Metadata
Assignees
Labels
No labels