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:

  1. Est-il vraiment plus pratique d'avoir une services.AddScoped pour chaque table de recherche dans le ConfigureServices méthode de Startup.cs?

  2. 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?

  3. 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 avec IGenericRepository<Lookup1> comme paramètre: public Lookup1Controller(IGenericRepository<Lookup1> repository). Ainsi, vous vous attendez à ce que MVC appelle le contrôleur constructeur Lookup1Controller avec le paramètre correspondant. Qui doit faire new GenericRepository<Lookup1>>()? Doit-on le faire une fois ou à chaque appel de Index action? Ainsi, vous avez le choix entre services.AddTransient, services.AddScoped, services.AddSingleton et services.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.
InformationsquelleAutor dfmetro | 2015-11-06