web-dev-qa-db-fra.com

Comment la couche entre le contrôleur MVC et l'arrière-plan sont-elles appelées?

J'ai une application ASP.NET MVC avec le contrôleur et l'action suivants:

public class AccountsController
{
    public ActionResult Index() 
    {
        var accounts = _accountsManager.GetAccounts();
        return View(accounts);
    }
}

et AccountsManager classe comme ceci:

public class AccountsManager
{ 
    private ILogger Logger ...
    private ICache Cache ...
    private IAccountsService Service ...
    private IMapper ViewModelMapper ...

    private const string CacheKey = "Accounts";

    public AccountViewModel[] LoadAccounts() 
    {
        try 
        {
            if (Redis.TryGet(CacheKey, out var cached)) // Cache
                return cached;

             var accounts = Service.GetAccounts(); // Call service
             var vms = ViewModelMapper.Map<AccountViewModel[]>(accounts); // Map result

             Redis.Set(CacheKey, vms); // Update cache
             return vms;
        } 
        catch (Exception ex)
        {
            Logger.Error(ex); // Log exceptions
            throw;
        }
    }
}

Donc, cette classe AccountsManagerLe recèle la duplication du code et encapsule la logique suivante:

  • Communication avec back-end
  • Résoudre les dépendances
  • Cache
  • Enregistrement
  • La gestion des erreurs
  • Cartographie de la vue
  • Demander réessayer, authentification de service, etc.

Cependant, appeler ces classes XXXManager me fait mal à l'aise depuis ce mot Manager est ambigu.

Comment cette couche est-elle généralement appelée?

4

Normalement, je dirais "la couche de service"

Mais cela ressemble à votre compteManager est une couche supplémentaire entre les couches d'hébergement et de service.

Je voudrais remettre en question la logique d'avoir cette couche supplémentaire.

  • Votre couche de service doit renvoyer les mêmes objets indépendamment de la manière dont il est accessible. Vous ne devriez pas avoir besoin de cette compteViewModel

  • La partie en cache du service ou une partie de l'hébergement? Si vous ne faites que mettre en cache le résultat final, faites-le sur la couche d'hébergement et que vous n'aurez pas du tout frappé le code.

  • Logging, encore une fois, je voudrais soit injecter ilogger dans le service ou l'avoir à la couche d'hébergement pour attraper des objets comme des erreurs de liaison et de routage

3
Ewan

Utilisation des modèles d'architecture d'applications d'entreprise de Martin Fowler, la terminologie, ceci serait appelé A passerelle parce que c'est la porte à la porte Système final, et il encapsule toutes les informations d'interaction en fin de compte. Vous pouvez ensuite le voir dans le cadre d'une couche source de données, qui découle le M de MVC des détails sales. Si le back-end est une base de données, il existe noms de motifs plus spécifiques En fonction de la manière dont vous accédez exactement à la base de données pour travailler avec les objets.

Si vous êtes fan de architecture hexagonale , vous appelez ceci AccountManager un adaptateur . Dans la architecture propre Ce serait une passerelle dans la couche d'adaptateur.


Remarque non liée: lorsque vous regardez toutes les responsabilités de cette classe, je me demande simplement si elle est conforme à SRP ..!

1
Christophe