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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions