2010-08-02 9 views
3

Est-il possible de définir AutoFac pour utiliser PropertiesAutowired (true) comme valeur par défaut pour tous les types enregistrés?Définir AutoFac pour utiliser PropertiesAutowired (true) par défaut?

dire que je ne veux pas utiliser ".PropertiesAutowired (true)" tout le temps

var builder = new ContainerBuilder(); 
builder.RegisterType<Logger>() 
    .PropertiesAutowired(true) 
    .SingleInstance(); 

Répondre

9

Ceci peut être fait avec un module, par ex.

class InjectPropertiesByDefaultModule : Autofac.Module { 
    protected override void AttachToComponentRegistration(
     IComponentRegistration registration, 
     IComponentRegistry registry) { 
      registration.Activating += (s, e) => { 
       e.Context.InjectProperties(e.Instance); 
      }; 
    } 
} 

Puis:

builder.RegisterModule<InjectPropertiesByDefaultModule>(); 

Je pense que vous pourriez être mal compris la nature true paramerter à PropertiesAutowired - il détermine la façon dont les dépendances circulaires sont pris en charge et devrait probablement rester false. Pour émuler le paramètre true, vous pouvez attacher à Activated au lieu de Activating ci-dessus. Cependant, si possible, utilisez l'injection de constructeur, même pour les dépendances "optionnelles" comme ILog. Il conduit à des composants plus propres (par exemple, les champs readonly) et les dépendances sont plus compréhensibles (ils sont tous dans le constructeur, et il n'y a pas de devinettes sur la signification des propriétés individuelles.)

sont des configurations multiples de l'application et dans certaines configurations la dépendance sera vraiment absente.

Même dans ces cas, le motif "Null Object" est généralement meilleur.

+0

Aussi - si vous intégrez Log4Net, jetez un oeil à: http://code.google.com/p/autofac/wiki/Log4NetIntegration :) –

+0

Nic. dans votre code d'où vient "e"? – Simon

+0

Merci Simon - aurait dû être "inscription" - corrigé maintenant. –

0

Non, il n'y a pas. Cependant, si vous enregistrez des types en masse ou par convention, cela sera plus facile, par ex. en utilisant builder.RegisterAssemblyTypes(..).

Mise à jour: Oui, voir @Nicholas answer.

+0

Comme je m'y attendais. Merci – Simon