Utilisation DbContext à l'ASP .Net Singleton Injecté Classe

Je besoin pour accéder à ma base de données dans une classe Singleton instancié dans mon Démarrage de la classe. Il semble que l'injecter directement les résultats dans un DbContext qui est éliminé.

J'obtiens l'erreur suivante:

Ne peut pas accéder à un objet supprimé. Nom de l'objet: 'MyDbContext'.

Ma question est double: Pourquoi ne pas ce travail et comment puis-je accéder à ma base de données dans une instance de la classe singleton?

Voici mon ConfigureServices méthode dans mon Démarrage de classe:

public void ConfigureServices(IServiceCollection services)
{
    //code removed for brevity

    services.AddEntityFramework().AddSqlServer().AddDbContext<MyDbContext>(
        options =>
        {
            var config = Configuration["Data:DefaultConnection:ConnectionString"];
            options.UseSqlServer(config);
        });

    //code removed for brevity

    services.AddSingleton<FunClass>();
}

Voici ma classe de contrôleur:

public class TestController : Controller
{
    private FunClass _fun;

    public TestController(FunClass fun)
    {
        _fun = fun;
    }

    public List<string> Index()
    {
        return _fun.GetUsers();
    }
}

Voici mon FunClass:

public class FunClass
{
    private MyDbContext db;

    public FunClass(MyDbContext ctx) {
        db = ctx;
    }

    public List<string> GetUsers()
    {
         var lst = db.Users.Select(c=>c.UserName).ToList();
        return lst;
    }
}
  • Voir cette réponse. Un objet ne peut pas avoir de dépendances avec une durée de vie plus courte que lui-même. Vous pouvez injecter une usine à créer à durée de vie courte des cas, ou de refactoriser donc la racine de l'objet graphique n'est pas un singleton.
  • Je déconseille vivement de vous inscrire à votre DbContext comme un Singleton, il existe de nombreux articles sur le web que vous dire pourquoi c'est une mauvaise idée. Voici un répondre fourni par le créateur de Simple Injecteur qui tente d'expliquer pourquoi. Je suggère fortement d'utiliser un modèle comme le Référentiel ou l'Unité de modèles de Travail.
  • merci. J'ai noté un avertissement dans mon travail de réponse.
  • Double Possible de Entity Framework Core service de durée de vie par défaut
InformationsquelleAutor Tjaart | 2016-03-31