0

LogUtil Konstruktor sieht wie folgt aus:configure parametrisierte Konstruktor für InjectionConstructor in UnityContainer

public LogUtil(object classType) 
    { 

     .... 
    } 

Mein folgenden Code korrekt funktioniert ..

var container = new UnityContainer(); 
container.RegisterType<ILogUtility, LogUtil>(new InjectionConstructor(this.GetType())); 
Logger logger = container.Resolve<Logger>(); 

ich Problem habe die Konstruktor-Einstellungen in der Konfigurationsdatei konfigurieren. ich konfiguriert, um den Behälter Registrierung wie folgt:

<container> 
    <register type="ILogUtility, Framework" 
       mapTo="LogUtil, Log4Net"> 

     <constructor> 
      <param name="classType" type="object"> 
      </param> 
     </constructor> 

    </register> 
    </container> 

Es Problem in Konstruktor Einstellung in der obigen Konfiguration zu sein scheint. Ich kann die "type" Informationen nicht korrekt übergeben. Es wird als "System.Object" im Gegensatz zum eigentlichen Klassentyp übergeben. Wie behebe ich die obige Konstruktorkonfiguration?

+1

Es ist nur eine Vermutung, würde ich annehmen, Sie müssen den Namen des Typs anstelle des Objekts übergeben. Also muss diese Zeile '' in etwas wie ' geändert werden. ' – oleksii

Antwort

1

Ich persönlich würde keine Konstruktorinjektion verwenden. Ich würde etwas mehr tun, wie folgt:

ist
Log.For(this).Debug("Some Stuff to log.")); //Debug is defined in ILogHandler. 

Der Typ in durch die Methodenaufrufe und nicht den Konstruktor übergeben:

public static class Log 
{ 
    private static readonly object SyncLock = new object(); 
    private static ILogFactory _loggerFactory; 

    private static void EnsureFactory() 
    { 
     if (_loggerFactory == null) 
     { 
      lock (SyncLock) 
      { 
       if (_loggerFactory == null) 
       { 
        _loggerFactory = ServiceLocator.Get<ILogFactory>(); 
       } 
      } 
     } 
    } 

    public static ILogHandler For(object itemThatRequiresLogging) 
    { 
     if (itemThatRequiresLoggingServices == null) 
      throw new ArgumentNullException("itemThatRequiresLogging"); 

     return For(itemThatRequiresLoggingServices.GetType()); 
    } 

    public static ILogHandler For(Type type) 
    { 
     if (type == null) 
      throw new ArgumentNullException("type"); 

     EnsureFactory(); 

     return _loggerFactory.CreateFor(type); 
    } 

    public static ILogHandler For<T>() 
    { 
     return For(typeof(T)); 
    } 
} 

Es wäre dergleichen verwendet werden.

1

Ich glaube nicht, dass Sie dies über die Konfiguration tun können. Dies ist eher eine statische Einstellung und Sie benötigen eine Laufzeit-Reflektion. Ihre Objekte in Ihrer LogUtil sollten jedoch wieder in ihren übergeordneten Typ umgewandelt werden können. Eine Sache, die Sie versuchen könnten, ist eine ILoggableObject Schnittstelle zu erstellen, und Sie könnten den Parameter so einstellen. Wenn Sie nach einer Methode/Eigenschaft suchen, die für alle Steuerelemente verfügbar ist

Verwandte Themen