Skip to content

di::extensions::factory recreates a singleton. #577

@skalinkin

Description

@skalinkin

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 015E8250

of 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

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions