5 votes

Elimination d'objets avec injection de dépendances

J'ai créé une classe de référentiel que je veux utiliser dans une page de code derrière. J'utilise l'injection de constructeur dans la page de code arrière pour instancier le référentiel.

Classe de dépôt :

BritanniaPremierEntities PBEntities = new BritanniaPremierEntities();

public IQueryable<TradeRoutes> GetRoutes()
{
    var routes = PBEntities.TradeRoutes.OrderBy(c => c.ConsignmentDate);        

    return routes;
}

public IQueryable<TradeRoutes> GetExpiredRoutes()
{
    var routes = PBEntities.TradeRoutes.Where(
        c => c.ConsignmentDate <= System.DateTime.Now);

    return routes;
}

Code derrière la page

private IRepository repos;

public Admin_TradeRoutesAdmin()
    : this(new Repository()) 
{
}

public Admin_TradeRoutesAdmin(IRepository repos)
{
    this.repos = repos;
}

public IQueryable GetTradeRoutes()
{        
    // call repository method
    return repos.GetRoutes();
}

C'est là que je suis un peu perdu. Comment dois-je m'assurer que le référentiel est disposé correctement ? Par exemple, je ne suis pas en mesure d'envelopper les appels au dépôt dans des déclarations using dans le code derrière la page, utilisant ainsi la méthode dispose du dépôt.

5voto

Mark Seemann Points 102767

Vous devez utiliser le Enregistrer Résoudre Modèle de libération .

Plus précisément, vous devez vous souvenir de Relâchez toujours ce que vous avez résolu . Il incombe au compositeur de savoir si la dépendance doit être éliminée ou non. Ceci est non trivial car cela dépend de différents facteurs :

  • La dépendance implémente-t-elle IDisposable ?
  • La durée de vie du lien indique-t-elle qu'il doit être éliminé maintenant ou plus tard ?

C'est une tâche tellement complexe que vous devriez utiliser un conteneur DI approprié pour le poste.

Cependant, gardez à l'esprit que cela dépend finalement de la prise en charge ou non du déclassement par votre conteneur DI. Par exemple, Castle Windsor le fait alors que StructureMap ne le fait pas.

1voto

Dmitri Nesteruk Points 7669

Eh bien, l'idée générale est que tout ce qui est créé par un conteneur DI est éliminé, à condition qu'il s'agisse d'une IDisposable . Le seul problème est quand qui se produit. Je pense qu'il peut y avoir des différences entre les différents conteneurs, mais mon point de vue sur ce sujet serait d'implémenter Dispose() dans l'objet en cours de création, et en appelant explicitement Dispose() sur l'objet injecté.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X