Modele de proiectare Method Injection și Property Injection
- 1 minute de citit
- 3 exemple de cod
Disponibil și în English
Pe această pagină
Salut,
În acest articol vom explora modelele de proiectare Method Injection și Property Injection.
Pentru a demonstra modelele voi adăuga o interfață nouă numită Encoder în fișierul printer.py, plus câte o implementare concretă pentru doi encoderi: Rot13Encoder și NullEncoder.
class Encoder(metaclass=abc.ABCMeta): def encode(self, message: Message) -> Message: raise NotImplementedError("encode must be implemented!")class Rot13Encoder(metaclass=abc.ABCMeta): def encode(self, message: Message) -> Message: return Message(codecs.encode(str(message), 'rot_13'))class NullEncoder(metaclass=abc.ABCMeta): def encode(self, message: Message) -> Message: return messageEncoder-ul va fi folosit de printer pentru a codifica mesajele înainte de a le afișa.
Method Injection
Modelul method injection este folosit ca alternativă la constructor injection atunci când dependența este opțională sau este folosită doar într-un singur loc, deci nu ar avea sens să fie injectată în constructor.
Clasa mea ConsolePrinter ar arăta așa dacă aș folosi acest model:
class ConsolePrinter(Printer): def __init__(self, prefix: str): self._prefix = prefix def print(self, message: Message, encoder: Encoder): print(self._prefix, encoder.encode(message))Atunci când application.py ar apela Printer.print, ar transmite Encoder-ul ca dependență.
Property Injection
Modelul property injection este folosit mai ales în biblioteci, aplicațiile ar trebui să îl evite. Pentru a folosi modelul property injection ar trebui să modific clasa ConsolePrinter astfel:
class ConsolePrinter(Printer): def __init__(self, prefix: str): self._prefix = prefix self.encoder = NullEncoder() def print(self, message: Message): print(self._prefix, self.encoder.encode(message))Am o proprietate numită encoder care, implicit, se comportă ca un NullEncoder. Dacă, din orice motiv, utilizatorul bibliotecii are nevoie să o schimbe, poate face acest lucru injectând dependența necesară în proprietate.
Codul pentru modelele Property Injection și Method Injection este pe Github-ul meu! 🙂
Mulțumesc pentru lectură!