2012-10-18 2 views
6

Für das folgende "Projekt" bekomme ich einen sehr ärgerlichen und unerklärlichen Fehler beim Auflösen von Unity für DI.Unity: Der Typ LogWriter kann nicht konstruiert werden

InvalidOperationException - Der Typ LogWriter kann nicht erstellt werden. Sie müssen den Container konfigurieren, um diesen Wert zu liefern.

? Ex.Meldung; "Die Auflösung der Abhängigkeit ist fehlgeschlagen, type = \" WindowsFormsApplication1.Performance \ ", name = \" (keine) \ ". \ R \ nException aufgetreten während: während der Auflösung. \ R \ nException ist: InvalidOperationException - Der Typ LogWriter kann nicht erstellt werden. Sie müssen den Container konfigurieren, um diesen Wert zu liefern. \ R \ n ----------------------------- ------------------ \ r \ nAuf der Zeit der Ausnahme war der Container: \ r \ n \ r \ n Auflösen WindowsFormsApplication1.Performance, (keine) \ r \ n Auflösung des Parameters \ "lw \" des Konstruktors WindowsFormsApplication1.Performance (Microsoft.Practices.EnterpriseLibrary.Logging.LogWriter lw, Microsoft.Practices.EnterpriseLibrary.Exceptio nHandling.ExceptionManager em) \ r \ n Auflösen Microsoft.Practices.EnterpriseLibrary.Logging.LogWriter, (none) \ r \ n“

ex.StackTrace?; "Bei Microsoft.Practices.Unity.UnityContainer.DoBuildUp (Typ t, Objekt bestehenden, String name, IEnumerable 1 resolverOverrides) in e:\\Builds\\Unity\\UnityTemp\\Compile\\Unity\\Unity\\Src\\UnityContainer.cs:line 515\r\n at Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, String name, IEnumerable 1 resolverOverrides) in e: \ Builds \ Unity \ UnityTemp \ Compile \ Unity \ Unity \ Src \ UnityContainer.cs : Zeile 485 \ r \ n bei Microsoft.Practices.Unity.UnityContainer.Resolve (Geben Sie t, String-Name, ResolverOverride [] ResolverOverrides) in e: \ Builds \ Unity \ UnityTemp \ Compile \ Unity \ Unity \ Src \ UnityContainer.cs: line 173 \ r \ n bei Microsoft.Practices.Unity.UnityContainerExtensions.Resolve [T] (IUnityContainer Behälter, ResolverOverride [] Überschreibungen) in e: \ baut \ Unity \ UnityTemp \ Compilieren \ Unity \ Unity \ Src \ UnityContainerExtensions.cs: Zeile 504 \ r \ n bei WindowsFormsApplication1.Form1.OnLoad (EventArgse) in D: \ DevZone \ Tasking \ WindowsFormsApplication1 \ Form1.cs: Zeile 33"

In einer Form:

protected override void OnLoad(EventArgs e) 
     { 
      base.OnLoad(e); 

      try 
      { 
       IUnityContainer container = new UnityContainer(); 
       Performance p = container.Resolve<Performance>(); 
      } 
      catch (Exception ex) 
      { 

      } 
     } 

Abhängigkeitsklasse:

public class Performance 
    { 
     public Performance(LogWriter lw, ExceptionManager em) 
     { 
     } 
    } 

Konfigurationsdatei:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
     <section name="loggingConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.LoggingSettings, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="true" /> 
     <section name="exceptionHandling" type="Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Configuration.ExceptionHandlingSettings, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="true" /> 
    </configSections> 
    <loggingConfiguration name="" tracingEnabled="true" defaultCategory="General"> 
     <listeners> 
      <add name="Event Log Listener" type="Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.FormattedEventLogTraceListener, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" 
       listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.FormattedEventLogTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" 
       source="Enterprise Library Logging" formatter="Text Formatter" 
       log="" machineName="." traceOutputOptions="None" /> 
     </listeners> 
     <formatters> 
      <add type="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" 
       template="Timestamp: {timestamp}{newline}&#xA;Message: {message}{newline}&#xA;Category: {category}{newline}&#xA;Priority: {priority}{newline}&#xA;EventId: {eventid}{newline}&#xA;Severity: {severity}{newline}&#xA;Title:{title}{newline}&#xA;Machine: {localMachine}{newline}&#xA;App Domain: {localAppDomain}{newline}&#xA;ProcessId: {localProcessId}{newline}&#xA;Process Name: {localProcessName}{newline}&#xA;Thread Name: {threadName}{newline}&#xA;Win32 ThreadId:{win32ThreadId}{newline}&#xA;Extended Properties: {dictionary({key} - {value}{newline})}" 
       name="Text Formatter" /> 
     </formatters> 
     <categorySources> 
      <add switchValue="All" name="General"> 
       <listeners> 
        <add name="Event Log Listener" /> 
       </listeners> 
      </add> 
      <add switchValue="All" name="Category2" /> 
     </categorySources> 
     <specialSources> 
      <allEvents switchValue="All" name="All Events" /> 
      <notProcessed switchValue="All" name="Unprocessed Category" /> 
      <errors switchValue="All" name="Logging Errors &amp; Warnings"> 
       <listeners> 
        <add name="Event Log Listener" /> 
       </listeners> 
      </errors> 
     </specialSources> 
    </loggingConfiguration> 
    <exceptionHandling> 
     <exceptionPolicies> 
      <add name="Policy"> 
       <exceptionTypes> 
        <add name="All Exceptions" type="System.Exception, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
         postHandlingAction="NotifyRethrow" /> 
       </exceptionTypes> 
      </add> 
     </exceptionPolicies> 
    </exceptionHandling> 
</configuration> 

Antwort

10

Sie die Erweiterung Enterprise Library hinzufügen müssen, um dein Behälter. Ohne diese Option liest der Container die Konfigurationsdatei nicht und weiß daher nicht, wie man ein Entlib-Objekt wie den LogWriter erstellt.

+0

Arhhhhhhhhh !!! Genial. Danke Kumpel. – rism

+1

Für alle anderen war das alles, was ich tun musste: var container = new UnityContainer(). AddNewExtension (); – rism

+0

Ich brauchte etwas Zeit, um es herauszufinden, aber diese Antwort war sehr hilfreich. Wenn jemand es in einer unity.config-Datei deklarieren möchte, sollte dies so gemacht werden: Konrad

0

Damit Unity Ihre Leistungsklasse erstellen kann, muss es wissen, wie die Implementierung von ILogWriter erstellt wird.

Ich kann nirgends in Ihrem Code sehen, wo Sie Unity mitteilen, welche Klasse für die ILogWriter-Schnittstelle erstellt werden soll. Daher vermute ich, dass Sie dies möglicherweise hinzufügen müssen.

+0

Er ist mit ILogWriter nicht, aber LogWriter, die eine konkrete Klasse, aber er bietet nicht die Abhängigkeiten, die LogWriter erfordern in seinem Konstruktor. – Tallmaris

+0

Das ist DI richtig, also frage ich nach einem LogWriter (eine konkrete Implementierung von ILogWriter) im Konstruktor der Performance-Klasse? – rism

+0

Ja, in der Tat, das muss ich mir vorgestellt haben. Gibt es einen parameterlosen Konstruktor für LogWriter? –

0

LogWriter hat keinen leeren Konstruktor oder Konstruktor mit allen konkreten Typen Parametern: LogWriter Constructor.

So Unity fehlschlägt beim Erstellen und wie es heißt, es wird Ihre Hilfe benötigen, indem Sie den Container für eine Implementierung konfigurieren.

Als Bestätigung wird ExceptionManager wahrscheinlich ok gelöst werden, da es dies nur ein constructor, parameterlos auch :)

+0

Hmm, was du gesagt hast, macht Sinn, aber ich erinnere mich nie daran, mich jemals mit Konstruktoren auf Typen aus Ent Lib-Blöcken zu beschäftigen. – rism

0

Versuchen hat:

protected override void OnLoad(EventArgs e) 
     { 
      base.OnLoad(e); 

      try 
      { 
       IUnityContainer container = new UnityContainer(); 
       container.RegisterType<ILogWriter, LogWriter>(); 
       container.RegisterType<ExceptionManager>(); 
       container.RegisterType<Performance>(new InjectionConstructor(typeof(ILogWriter), typeof(ExceptionManager));      
       Performance p = container.Resolve<Performance>(); 
      } 
      catch (Exception ex) 
      { 

      } 
     } 
Verwandte Themen