J'ai un dilemme. J'ai utilisé DI (lire: usine) pour fournir des composants de base pour un ORM homebrew. Le conteneur fournit des connexions de base de données, des DAO, des mappeurs et leurs objets de domaine résultants sur demande.Modèle d'injection de dépendances et unité de travail
Voici un aperçu de base des cartographes et des classes d'objets de domaine
class Mapper{
public function __constructor($DAO){
$this->DAO = $DAO;
}
public function load($id){
if(isset(Monitor::members[$id]){
return Monitor::members[$id];
$values = $this->DAO->selectStmt($id);
//field mapping process omitted for brevity
$Object = new Object($values);
return $Object;
}
}
class User(){
public function setName($string){
$this->name = $string;
//mark modified by means fair or foul
}
}
Le ORM contient également une classe (Monitor) basée sur l'unité de modèle de travail à savoir
class Monitor(){
private static array modified;
private static array dirty;
public function markClean($class);
public function markModified($class);
}
La classe ORM elle-même coordonne simplement les ressources extraites du conteneur DI. Donc, pour instancier un nouvel objet Utilisateur:
$Container = new DI_Container;
$ORM = new ORM($Container);
$User = $ORM->load('user',1);
//at this point the container instantiates a mapper class
//and passes a database connection to it via the constructor
//the mapper then takes the second argument and loads the user with that id
$User->setName('Rumpelstiltskin');//at this point, User must mark itself as "modified"
Ma question est. Au moment où un utilisateur définit des valeurs sur une classe d'objets de domaine, je dois marquer la classe comme "sale" dans la classe Monitor. J'ai l'une des trois options que je peux le voir
1: Passer une instance de la classe Monitor à l'objet de domaine. J'ai remarqué que ceci est marqué comme récursif dans FirePHP - c'est-à-dire $ this-> Monitor-> markModified ($ this)
2: Instancier le moniteur directement dans l'objet de domaine - cela brise-t-il DI? 3: Rendre les méthodes Monitor statiques, et les appeler depuis l'intérieur de l'objet de domaine - cela casse aussi DI non?
Quelle serait votre plan d'action recommandé (autre que d'utiliser un ORM existant, je le fais pour le plaisir ...)
L'ORM conserve-t-il une référence de l'objet renvoyé? Si non, pourquoi le moniteur est-il dans l'ORM? Si l'entité possède son propre moniteur, alors quand tout est retransmis à l'ORM pour les opérations CRUD, l'ORM boucle les moniteurs pour les changements? –
Non, le moniteur conserve un enregistrement de toutes les classes chargées - donc $ User1 et $ User2 pointent vers le même objet dans Monitor si ce sont les mêmes enregistrements. L'ORM lui-même est juste une façade pour gérer l'interaction des mappeurs, etc. Boucles ORM Surveiller les modifications en cours d'enregistrement – sunwukung
Je suis confus sur votre utilisation des motifs, principalement parce que ce n'est pas comme cela que je l'aurais paramétré. Mettre le DI * dans * l'ORM brise l'injection de dépendance, n'est-ce pas? L'ORM est alors une usine pour les objets de domaine, plutôt qu'un ORM plus traditionnel. Je ne placerais pas le moniteur dans la fabrique d'objets de domaine.Dans ce scénario, je le rends statique. Si je ne comprends pas ce que vos habitudes accomplissent, je m'excuse. –