2010-04-01 11 views
0

Dans mon projet Asp.Net, je veux utiliser la propriété Auto-câblage, par exemple. pour mon ILogger. Fondamentalement, je l'ai placé en tant que propriété dans la classe où je dois l'utiliser. Comme ci-dessous. Toutefois, lors de l'appel d'un contrôle hérité, l'enregistreur est null. J'ai vérifié le conteneur et c'est définitivement défini comme ci-dessus montre des spectacles. Ci-dessous, le paramètre appelé depuis Global.asax.Le câblage automatique de la propriété ne fonctionne pas pour moi

public static void SetupForIoC() 
    { 
     Debug.WriteLine("SetupForIoC"); 
     ObjectFactory.Initialize(x => 
     { 
      x.FillAllPropertiesOfType<ILogger>().Use<EntLibLogger>(); 
     }); 

     Debug.WriteLine(ObjectFactory.WhatDoIHave()); 
    } 

Merci pour le conseil, tip? X.

Mise à jour:
- Je ne ai pas mentionné avant, mais son Asp.Net WEBForms 3.5.
- Je ne vois pas ce qui me manque. Je suppose que cela pourrait être parce que l'injection est impliquée plus tard dans le processus et n'a pas été fixée dans la classe demandée.

Lien vers desc. Où est-ce que vous définissez réellement la propriété CLogger sur le contrôle de l'utilisateur? http://structuremap.github.com/structuremap/ConstructorAndSetterInjection.htm#section7

Répondre

0

Donnez quelque chose comme ceci.

FillAllPropertiesOfType<ILogger>().AlwaysUnique().Use(s => s.ParentType == null ? new Log4NetLogger(s.BuildStack.Current.ConcreteType) : new Log4NetLogger((s.ParentType))); 

Découvrez une autre réponse StackOverflow je qui discute using StructureMap to auto wire loggers.

+0

Je suis désolé, je ne comprends pas. Est-ce que la solution suggérée nécessite de créer un constructeur spécifique? Je n'ai actuellement que le paramètre moins constructeur pour la classe de journalisation (EntLibLogger). Y a-t-il un besoin spécifique d'injecter la classe requise dans un contexte spécifique? –

+0

L'enregistreur log4net que j'utilisais peut prendre un type comme portée pour la journalisation. C'est bien d'avoir vos scieurs à portée de vos classes à certains moments. Rend super rapide pour obtenir le contexte sur le problème. Vous ne savez pas comment vous étiez en train de scoping vos enregistreurs. Si vous n'avez pas besoin de contrôler la construction de votre enregistreur, FillAllPropertiesOfType devrait faire ce dont vous avez besoin. – KevM

0

Où? En outre, si vous souhaitez utiliser un enregistreur dans la page, vous pouvez demander à l'utilisateur cotnrol:

public ILogger CLogger 
{ 
    get 
    { 
    if (this.Page is PageBase) 
     return ((PageBase)this.Page).Logger; 
    else 
     return null; 
    } 
} 
+0

Le point est que je ne veux pas le mettre. Je veux faire DI pour moi. Selon l'aide de StructureMap, cela devrait fonctionner de cette manière. L'enregistreur lui-même est juste utilisé dans le code derrière pour une simple journalisation (erreur, info, alertes) –