-
Notifications
You must be signed in to change notification settings - Fork 92
Description
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!