2011-12-23 4 views
1

Besoin d'un conseil sur la «meilleure» façon d'implémenter les opérations de mise à jour et de suppression sur les DTO imbriqués complexes. Par exemple très simple, supposons que nous avons cette structure:Opérations CRUD sur le DTO complexe

public class Person 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public Employer Company { get; set; } 
} 
public class Employer 
{ 
    public string Name { get; set; } 
    public string Address1 { get; set; } 
    public string City { get; set; } 
    public string State { get; set; } 
} 

Une mise à jour par personne que l'employeur peut signifier plusieurs choses ici: 1. Auparavant, il n'y avait pas l'employeur pour personne et nous devons faire insérer à DB à présenter un nouvel employeur. 2. Il y avait un employeur auparavant et nous mettre à jour uniquement des données internes 3. Employeur de l'employeur a été retiré de la personne

Question:

Si vous avez un domaine/activité objet compnent quelque chose comme PersonBusinessComponent avec certains méthode comme PersonBusinessComponent.Update (Person) Quel est le meilleur moyen d'identifier quel scénario est en cours d'exécution et d'appliquer des changements - ce qui signifie que s'il s'agit d'une opération de suppression, nous appellerons une méthode EmployerDALC.Delete ou s'il s'agit d'un Insert EmployerDALC.Insert etc ... Je comprends qu'une option est d'obtenir la version actuelle de la base de données, puis comparez péniblement pour l'existence de tous les objets imbriqués dans Person, mais j'espère qu'il y a un meilleur moyen ou même un moyen plus générique qui peut être implémenté pour gérer de telles opérations dans la solution entière.

Remarque: Je n'utilise pas MS Entity Framework.

+0

Cela dépend de l'architecture de votre système. S'agit-il d'un modèle procédural, d'un modèle ActiveRecord ou d'un modèle de domaine? Je vois que vous utilisez des DTO, ce qui impliquerait un modèle de domaine. –

Répondre

0

Cela dépend de l'architecture de votre système. S'agit-il d'un modèle procédural, d'un modèle ActiveRecord ou d'un modèle de domaine? Je vois que vous utilisez des DTO, ce qui impliquerait un modèle de domaine.

Si oui, alors votre logique métier (dans le niveau «Services) serait chargé d'orchestrer les opérations, par exemple:

public interface PersonManager 
{ 
    void CreateNewPerson(Person person); 
    void DeletePerson(Person person); 
    void ModifyPerson(Person person); 
    // ... and so on .../ 
} 

Le PersonManager serait alors chargé d'examiner l'objet et de travailler ce faire avec elle en fonction de la méthode exécuter. Il repasserait alors à sa propre couche logique métier (qui peut converser avec la couche d'accès logique) pour déterminer exactement comment cela devrait être réalisé. Par exemple, avec la méthode Modifier peut interroger la DAL pour obtenir le son employeur actuel pour cette personne, reporter à une ModifyEmployer si l'employeur a changé etc:

public void ModifyPerson(Person person) 
{ 
    var currentEmployer = DAL.Employers.Get(Person.Employer.EmployerID); 
    if (currentEmployer != person.Employer) 
    { 
    // Try and get a matching Employer from the appropriate Service (liaising with the DAL) 
    var employer = EmployerManager.GetEmployer(person.Employer.EmployerID); 
    if (employer == null) 
    { 
     // ... Create a new employer 
    } 
    else if (employer != person.Employer) 
    { 
     // ... Update existing employer 
    } 
    } 

    // ... Now go ahead and handle any changes to the person 
} 

Du haut de ma tête, je ne peux pas penser Je dirais que tout est dans l'architecture de votre système et comment le BL parle à la DAL, mais je suis sûr que l'une des boîtes de cerveau ici va proposer de meilleures suggestions. :)

Espérons que cela pourrait aider un peu!

K.

Questions connexes