2009-11-12 7 views
1

Je termine une réécriture d'un outil de gestion de projet en utilisant ASP.NET MVC, LINQ2QL et le modèle de conception de référentiel. À peu près en suivant l'exemple de NerdDinner.Où placer la logique métier * advanced * dans le projet ASP.NET MVC/Linq2Sql?

J'ai une classe appelée Task qui a une liste d'enfants de TaskStages. Par souci de cet exemple, les étapes sont prêtes, en développement et terminées. Je garde une trace de l'étape actuelle sur la tâche, mais chaque fois que la scène change, je veux écrire un enregistrement historique dans la table de l'étape de la tâche.

Je me bats sur où mettre cette fonctionnalité et maintenir la testabilité. Est-ce que ça va dans le contrôleur? Dépôt? ou la classe partielle?

S'il s'agit d'un problème de conception, faites-le moi savoir!

Répondre

2

Vous pouvez gérer cela de deux façons.

Personnellement, je créerais des objets métier placés entre le contrôleur et l'accès aux données (Repository/LINQ2SQL). Vous utiliseriez ensuite ces objets comme modèle et interagiriez avec les données à travers eux.

Vous pouvez également placer la logique dans le contrôleur ... mais vous devez répéter cette logique dans le tableau si plusieurs zones de l'application doivent fonctionner de la même manière.

+0

Je suis vraiment en train d'essayer de garder l'application mince, donc si je n'avais pas besoin de créer un * real * des objets métier comme je le voudrais. Afin de le tester correctement, je suppose que je devrais le mettre dans le contrôleur ... non? – mattruma

+0

Je me demandais si je pouvais simplement ajouter une méthode update() au dépôt, je pourrais alors faire mes vérifications là-bas? – mattruma

+0

Le Repo ne devrait pas vraiment être pour la logique métier - uniquement l'accès aux données. Mettez-le dans le contrôleur si vous devez. Doit aimer Justin je suggérerais une autre couche d'abstraction: les objets de domaine et une couche de Service. Ce n'est pas une quantité énorme de travail et vous récolterez les récompenses immédiatement. –

0

Je suis nouveau sur ASP.NET MVC mais j'aurais une méthode sur la classe pour changer les étapes et mettre la logique pour suivre ces changements dans cette méthode (refactoring si nécessaire). Bref, je ne pense pas que cela appartienne explicitement au contrôleur.

+0

Je pensais la même chose ... mais je me débattais avec * comment *. Je devrais créer une instance du référentiel pour effectuer l'accès aux données dont j'avais besoin. – mattruma

2

... chaque fois que les changements de scène que je veux écrire un record historique au Groupe table de scène.

Vous devez avoir un service qui est responsable de la modification étape:

public interface IStageChanger { 
    void Rename(Task t, string newName); 
    // etc 
} 

Je me bats sur où mettre cette fonctionnalité et maintenir testabilité. Est-ce que ça va dans le contrôleur ? Dépôt? ou la classe partielle ?

Aucune. Niveau de service. Vous pouvez avoir un autre service responsable de la rédaction de l'histoire, de sorte que la mise en œuvre résultant de IStageChanger serait semblable à ceci:

public class StageChanger : IStageChanger { 
    public StageChanger(ITaskHistoryWriter historyWriter) { 
     // 
    } 

    public void Rename(Task t,string newName) { 
     history.Write(t, /*whatever*/) 
    } 
} 

Ensuite, vous à l'aide de conteneurs injection de dépendances (Windsor ou similaire) Il suffit de demander votre service de changeur.