2012-10-18 16 views
6

Per il seguente "progetto" sto ricevendo un errore molto fastidioso e inspiegabile quando si risolve Unity per DI.Unity: il tipo LogWriter non può essere costruito

InvalidOperationException - Il tipo LogWriter non può essere creato. È necessario configurare il contenitore per fornire questo valore.

? Ex.Messaggio; "Risoluzione della dipendenza non riuscita, digitare = \" WindowsFormsApplication1.Performance \ ", name = \" (nessuno) \ ". \ R \ nException avvenuto mentre: durante la risoluzione. \ R \ nException è: InvalidOperationException - Il tipo LogWriter non può essere creato . È necessario configurare il contenitore per fornire questo valore . \ R \ n ----------------------------- ------------------ \ r \ nAl momento dell'eccezione , il contenitore era: \ r \ n \ r \ n Risoluzione WindowsFormsApplication1.Performance, (nessuno) \ r \ n Risoluzione del parametro \ "lw \" del costruttore WindowsFormsApplication1.Performance (Microsoft.Practices.EnterpriseLibrary.Logging.LogWriter lw, Microsoft.Practices.EnterpriseLibrary.Exceptio nHandling.ExceptionManager em) \ r \ n Risoluzione Microsoft.Practices.EnterpriseLibrary.Logging.LogWriter, (none) \ r \ n"

ex.StackTrace?; "A Microsoft.Practices.Unity.UnityContainer.DoBuildUp (tipo T, oggetto esistente, 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 \ unità \ UnityTemp \ Compile \ unità \ unità \ Src \ UnityContainer.cs : riga 485 \ r \ n in Microsoft.Practices.Unity.UnityContainer.Resolve (Tipo t, Nome stringa, ResolverOverride [] resolverOverrides) in e: \ Build \ Unity \ UnityTemp \ Compile \ Unity \ Unity \ Src \ UnityContainer.cs: linea 173 \ r \ n al Microsoft.Practices.Unity.UnityContainerExtensions.Resolve [T] (IUnityContainer contenitore, ResolverOverride [] override) in e: \ Builds \ unità \ UnityTemp \ Compile \ unità \ Unity \ Src \ UnityContainerExtensions.cs: riga 504 \ r \ n al WindowsFormsApplication1.Form1.OnLoad (EventArgs) in D: \ DevZone \ Tasking \ WindowsFormsApplication1 \ Form1.cs: linea 33"

In una forma:

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

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

      } 
     } 

classe dipendenza: File

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

Configurazione:

<?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> 

risposta

10

è necessario aggiungere l'estensione a Enterprise Library il tuo contenitore. Senza di esso, il contenitore non legge il file di configurazione e quindi non sa come creare oggetti Entlib, come il LogWriter.

+0

Arhhhhhhhhh !!! Eccezionale. Grazie compagno. – rism

+1

Per chiunque altro è tutto ciò che dovevo fare: var container = new UnityContainer(). AddNewExtension (); – rism

+0

Mi ci è voluto un po 'di tempo per capirlo, ma questa risposta mi è stata di grande aiuto. Se qualcuno vuole dichiararlo in un file unity.config questo è come dovrebbe essere fatto: Konrad

0

Affinché Unity possa costruire la propria classe Performance, è necessario sapere come costruire l'implementazione di ILogWriter.

Non riesco a vedere da nessuna parte nel codice in cui dici a Unity quale classe creare per l'interfaccia di ILogWriter, quindi ho il sospetto che potrebbe essere necessario aggiungerlo.

+0

Egli non utilizza ILogWriter, ma logwriter, che è una classe concreta, ma non fornisce le dipendenze che logwriter richiede nel suo costruttore. – Tallmaris

+0

Questo è giusto, quindi sto chiedendo un LogWriter (una implementazione concreta di ILogWriter) nel costruttore della classe Performance? – rism

+0

Sì, davvero lo sei, devo averlo immaginato. Quindi c'è un costruttore senza parametri per LogWriter? –

0

LogWriter non ha un costruttore o un costruttore vuoto con tutti i parametri dei tipi di calcestruzzo: LogWriter Constructor.

Quindi Unity non riesce a crearlo e, come si dice, avrà bisogno del tuo aiuto configurando il contenitore per fornire un'implementazione.

A conferma, ExceptionManager sarà probabilmente risolto ok, dal momento che ha un solo constructor, senza parametri così :)

+0

Hmm quello che hai detto ha senso, ma non mi ricordo mai di me stesso con i costruttori su tipi di blocchi Ent Lib. – rism

0

Prova questa:

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) 
      { 

      } 
     } 
Problemi correlati