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 AccountsManager
Le recèle la duplication du code et encapsule la logique suivante:
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?
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
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 ..!