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 message

Encoder-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ă!