Come utilizzare i metodi di pattern DataMapper, durante il caricamento dei dati dal database?

1

Come si usa Pattern DataMapper? Posso usarlo come oggetto di accesso al database glorificato, alias TableGateway (caricando una singola classe da una singola tabella di database), oppure posso usarlo di più per stimolare le preoccupazioni aziendali (ad esempio caricare oggetti complessi da molte tabelle DB). O mescolare entrambi?

Esempio

Supponiamo che nella mia applicazione aziendale abbia un Product e un Motor entità. A volte ho bisogno di uno solo, a volte solo dell'altro. Ma a volte ho bisogno di una struttura in cui un motore appartiene a un prodotto. (Il prodotto è proprietario del motore), e ho bisogno di caricare entrambi, e posso creare e utilizzare una singola funzione del mio DataMapper per farlo.

Denominazione / struttura orientata al business

$products = new ProductDataMapper();

//This is the business-relevant construct, loading a complex object
$product = $products->getProductWithMotor(1, 2);//ids

echo $product->getName();  //"Product with id 1"
echo $product->getMotor()->getName();  //"Motor with id 2"

TableGateway Naming / Structure

$products = new ProductDataMapper();
//just loading an object by id, no specific business meaning
$product = $products->findById(1);

$motors = new MotorDataMapper();
//just loading an object by id
$motor = $motors->getMotor(2);

//business-relevant line (Product owns the Motor)
//that was hidden away inside the getProductWithMotor above, 
//now inside some business layer
$product->setMotor($motor);

echo $product->getName();  //"Product with id 1"
echo $product->getMotor()->getName();  //"Motor with id 2"

Domanda

La mia domanda riguarda "Che cosa era / è l'intento di utilizzare il pattern DataMapper?"

Esiste l'intento di utilizzare come livello aziendale (ovvero caricare oggetti rilevanti per il business con funzioni DataMapper per creare oggetti complessi relativi al business), o è puramente inteso a fare semplici funzioni Crea / Aggiorna / Elimina / Inserisci ed è disconnettersi dalla creazione di oggetti rilevanti per il business, lasciandolo su un livello di funzionalità aziendale?

    
posta Dennis 02.07.2015 - 17:08
fonte

1 risposta

1

Poiché un data mapper dovrebbe avere un'unica responsabilità, dovrebbe solo mappare i risultati della query a un oggetto o oggetto (i) e restituirli al chiamante.

Nel tuo caso abbiamo:

  • prodotto
  • Motore

Quindi, penso che uno definisca sicuramente i mapper per quegli oggetti definiti.

Credo che le tue scelte per la mappatura di prodotti e motori siano:

  1. Composizione. I prodotti possono avere una lista o array o motori, quindi possono essere gestiti tramite composizione. Puoi tornare indietro un elenco di motori e quindi aggiungere semplicemente quei motori al prodotto al di fuori del mapper.
  2. Un altro oggetto chiamato ProductMotor. Il mappatore esegue il mapping su un oggetto chiamato ProductMotor e restituisce un oggetto di quel tipo.

Entrambe le opzioni potrebbero essere accettabili in base all'utilizzo e al layout del sistema.

In base ai tuoi commenti di seguito una query con un join potrebbe restituire le informazioni su motore e prodotto su un record di dati, un po 'di codice psuedo:

Public Product MapProduct(IRecord record)
{
    var product = new Product();
    product.Name = record["name"].ToString();
    //And so forth...
    product.Motor = MapMotor(record);
    return product;
}

Public Motor MapMotor(IRecord record)
{
    var motor= new Motor();
    motor.Name = record["name"].ToString();
    //And so forth...
    return motor;
}
    
risposta data 02.07.2015 - 17:37
fonte

Leggi altre domande sui tag