2011-02-02 2 views
1

novice ici, désolé si cela est une question évidente.référence forte de Autofac 2

J'ai lu cette page: http://code.google.com/p/autofac/wiki/NewInV2

Dans Autofac 1, les références faibles sont détenues par le conteneur. Cela prend tout son sens si les objets référencés utilisent la mise au rebut pour libérer les ressources du GC/finaliseur, mais si la méthode dispose de la logique de l'application, la synchronisation du GC peut introduire un comportement inattendu.

Autofac 2 contient des références normales. Pour désactiver ce comportement et gérer manuellement la mise au rebut, utilisez le modificateur d'enregistrement ExternallyOwned.

Est-ce que cela veut dire quand je dois libérer un objet qui est résolu par Autofac au GC, je ne peux pas dire simplement:

a = null; 

parce que Autofac détient une forte référence à l'objet. Au lieu de cela, je devrais utiliser occasion <>:

public class MyClass 
{ 
    public MyClass(Owned<A> a) 
    { 
     a.Value.Dosomething(); 
     a.Dispose(); 
    } 
} 

ou utiliser le modificateur d'enregistrement ExternallyOwned:

builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()).ExternallyOwned(); 

plus tard, je devrais être en mesure d'utiliser un = null pour libérer l'objet du GC.

Est-ce exact?

Merci!

Répondre

3

Par défaut, vous n'avez rien à éliminer - Autofac identifie et élimine automatiquement les instances IDisposable créées lors de la suppression de leur portée de vie.

Vous avez seulement besoin d'utiliser Owned<T> ou ExternallyOwned() si vous avez une raison de gérer manuellement la durée de vie de l'objet. Si vous résolvez un Owned<T> alors vous devriez appeler t.Dispose() vous - le modèle d'usage courant est de prendre une dépendance à l'égard d'un délégué de l'usine:

public class MyClass 
{ 
    private Func<Owned<User>> myDisposableFactory; 

    public MyClass(Func<Owned<User>> myDisposableFactory) 
    { 
     this.myDisposableFactory = myDisposableFactory; 
    } 

    public void DoSomething() 
    { 
     using (var disposable = this.myDisposableFactory()) 
     { 
      // ... 
      disposable.Dispose(); 
     } 
    } 
} 

Si vous enregistrez un type que ExternallyOwned() alors Autofac ne disposera d'aucun cas résolu lorsque la durée de vie de la vie contenant des objets se termine - c'est à vous de la gérer. Pour plus d'informations, consultez Nicholas Blumhardt's article on lifetimes.

+0

Merci pour la réponse rapide et le lien! –

Questions connexes