Générique référentiel dans ASP.NET de Base, sans avoir séparé AddScoped ligne par table en Démarrage.cs?
J'ai un générique référentiel dans mon projet.
Envisager le contrôleur suivant extrait de
public class Lookup1Controller : Controller
{
readonly MyDbContext _db;
public Lookup1Controller(MyDbContext dataContext)
{
_db = dataContext;
}
public async Task<IActionResult> Index()
{
IGenericRepository<Lookup1> _repository = new GenericRepository<Lookup1>(_db);
var lookup1s = await _repository.SelectAll();
return View(lookup1s);
}
Je ne vois pas la nécessité d'avoir ma Base de données de référence, à la fois dans mon Générique référentiel ainsi que chacun de mes contrôleurs.
Je refactoriser le code pour:
public class Lookup1Controller : Controller
{
private IGenericRepository<Lookup1> _repository;
public Lookup1Controller(IGenericRepository<Lookup1> repository)
{
_repository = repository;
}
public async Task<IActionResult> Index()
{
var lookup1s = await _repository.SelectAll();
return View(lookup1s);
}
}
qui est beaucoup plus nette et ASP.NET 5 des meilleures pratiques provenant de ce que j'ai lu.
mais j'obtiens l'erreur suivante si j'ai accès que contrôleur de route dans mon navigateur:
InvalidOperationException: Unable to resolve service for type 'MyProject.Data.IGenericRepository`1[MyProject.Models.Lookup1]' while attempting to activate 'MyProject.Controllers.Lookup1.
car je n'ai pas injecté le GenericRepository à utiliser l'interface.
- Je ajouter à mon Startup.cs
un AddScoped
ligne pour chacun de mes tables dans la ConfigureServices
méthode
services.AddScoped<IGenericRepository<Lookup1>,GenericRepository<Lookup1>> ();
services.AddScoped<IGenericRepository<Lookup2>,GenericRepository<Lookup2>> ();
services.AddScoped<IGenericRepository<Lookup3>,GenericRepository<Lookup3>> ();
services.AddScoped<IGenericRepository<Lookup4>,GenericRepository<Lookup4>> ();
etc
pour que mon code fonctionne sans lancer une exception.
Cependant ma base de données a environ 100 simple des tables de recherche. Quand je regarde au-dessus de 100 lignes de code, il n'a tout simplement pas regarder à droite.
Il se sent comme le copier-coller le code. Chaque fois que j'ajoute une nouvelle table par l'ajout d'un nouveau modèle et contrôleur avec vue mon code compile sans me donner une erreur. Mais si je lance le programme et d'aller à ce point de vue que j'ai pu obtenir le contrôleur des erreurs de l'exécuter si j'ai oublié d'ajouter le AddScoped ligne à mon Startup.cs
. Pas vraiment bon pour la maintenabilité.
Ma question:
-
Est-il vraiment plus pratique d'avoir une services.AddScoped pour chaque table de recherche dans le
ConfigureServices
méthode deStartup.cs
? -
C'est un générique de référentiel n'est-il pas y avoir une façon d'écrire ces 100 copier et coller les lignes en une seule ligne?
-
Si non alors quelle est la meilleure pratique de la façon de le faire à l'aide de mon code?
- Vous utilisez constructeur de
Lookup1Controller
avecIGenericRepository<Lookup1>
comme paramètre:public Lookup1Controller(IGenericRepository<Lookup1> repository)
. Ainsi, vous vous attendez à ce que MVC appelle le contrôleur constructeurLookup1Controller
avec le paramètre correspondant. Qui doit fairenew GenericRepository<Lookup1>>()
? Doit-on le faire une fois ou à chaque appel deIndex
action? Ainsi, vous avez le choix entreservices.AddTransient
,services.AddScoped
,services.AddSingleton
etservices.AddInstance
. - C'est un CRUD de base du système. Donc, il est à Créer. Mettre à jour, Supprimer méthodes j'ai omis. À l'aide de AddScoped semble être le standard de la façon de le faire Voir:wildermuth.com/2015/3/17/A_Look_at_ASP_NET_5_Part_3_-_EF7. Si il y a une meilleure manière s'il vous plaît partager.
Vous devez vous connecter pour publier un commentaire.
Suffit d'utiliser la non-générique d'inscription surcharges (ceux où vous devez passer les 2
Type
objets.) Puis l' ouvrir les types génériques de votre interface et la mise en œuvre:Dans votre contrôleur ajouter une dépendance pour un dépôt d'un type spécifique (un fermé de type générique)