Skip to content

Binding multiple interfaces to same implementation #206

@qb-fredrikomstedt

Description

@qb-fredrikomstedt

Hi!

This issue is somewhat related to #181. Let's say I have the following code structure:

from abc import ABC, abstractmethod


class FileReader(ABC):
    @abstractmethod
    def read(self, file_path: str) -> str:
        pass


class FileWriter(ABC):
    @abstractmethod
    def write(self, file_path: str) -> None:
        pass


class FileHandler(FileReader, FileWriter):
    def read(self, file_path: str) -> str:
        # Do file reading stuff

    def write(self, file_path: str) -> None:
        # Do file writing stuff

Essentially a class that implements two interfaces, where only one interface may be needed elsewhere at a given time (for instance, many classes may need to read the files but only a few may need to write to them).

The FileHandler class could be instantiated as a Singleton, which in turn makes it reasonable that both FileReader and FileWriter bind to the same object. As is mentioned in #181, the following does not work (it creates two instances of FileHandler):

injector = Injector()

injector.binder.bind(FileReader, to=FileHandler, scope=singleton)
injector.binder.bind(FileWriter, to=FileHandler, scope=singleton)

Instead, it is suggested to create a Module doing the following:

class FileModule(injector.Module):
    def configure(self, binder: injector.Binder) -> None:
        binder.bind(FileHandler, scope=singleton)

    @provider
    def provide_reader(self, implementation: FileHandler) -> FileReader:
        return implementation

    @provider
    def provide_writer(self, implementation: FileHandler) -> FileWriter:
        return implementation

This seems like a lot of code for a binding of several interfaces to one instance. In other DI frameworks, I've seen syntax similar to:

injector.binder.bind([FileReader, FileWriter], to=FileHandler, scope=singleton)

I don't know if I've missed something, but is this possible to do in injector? If not, I think it would be a nice addition to the library.

Thanks!

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