2012-10-18 25 views
6

對於下面的「項目」,解決Unity for DI時,我遇到了一個非常惱人的和莫名其妙的錯誤。Unity:無法構建LogWriter類型

InvalidOperationException - 無法構造LogWriter類型。 您必須配置容器以提供此值。

?ex.Message; 「解析依賴項失敗,類型= \」WindowsFormsApplication1.Performance \「,名稱= \」(none)\「。\ r \ n異常發生while:解析。\ r \ n異常 is:InvalidOperationException - 類型LogWriter不能爲 構建。您必須配置容器以提供此值 值。\ r \ n ----------------------------- ------------------ \ r \ n在例外情況的 時間,容器是:\ r \ n \ r \ n正在解決 WindowsFormsApplication1.Performance,(none) \ r \ n解析參數 構造函數「lw \」 WindowsFormsApplication1.Performance(Microsoft.Practices.EnterpriseLibrary.Logging.LogWriter lw, Microsoft.Practices.EnterpriseLibrary.Exceptio nHandling.ExceptionManager EM)\ r \ n解決 Microsoft.Practices.EnterpriseLibrary.Logging.LogWriter,(無)\ r \ n」個

ex.StackTrace?; 「在 e_ \ Builds \ Unity \ UnityTemp \ Compile \ Unity \ Unity \ Src \ UnityContainer.cs中的Microsoft.Practices.Unity.UnityContainer.DoBuildUp(類型t,對象 存在,字符串名稱,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)在 : e:\ Builds \ Unity \ UnityTemp \ Compile \ Unity \ Unity \ Src \ Microsoft \ UnityContainer.cs:line 173 \ r \ n在 e:\ Builds \ Unity \ UnityTemp \ Compile \ Unity \ Microsoft \ Practice.Unity.UnityContainerExtensions.Resolve [T](IUnityContainer container,ResolverOverride []覆蓋) Unity \ Src \ UnityContainerExtensions.cs:line 504 \ r \ n在WindowsFormsApplication1.Form1.OnLoad(EventArgs的發送)在 d:\ Devzone \任務處理\ WindowsFormsApplication1 \ Form1.cs中:行33"

在一種形式中:

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

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

      } 
     } 

相關性類:

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

配置文件:

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

回答

10

您需要企業庫擴展添加到你的容器。沒有它,容器不會讀取配置文件,因此不知道如何創建Entlib對象,如LogWriter。

+0

Arhhhhhhhhh !!!真棒。謝了哥們。 – rism

+1

對於其他人,這是我需要做的所有事情:var container = new UnityContainer()。AddNewExtension (); – rism

+0

我花了一些時間弄清楚,但這個答案是非常有幫助的。如果有人想在unity.config文件中聲明它,這是應該如何完成的: Konrad

0

爲了讓Unity構建您的Performance類,它需要知道如何構建ILogWriter的實現。

我看不到你的代碼中的任何地方,你告訴Unity爲ILogWriter接口創建什麼類,所以我懷疑你可能需要添加這個。

+0

他沒有使用ILogWriter,但寫進程,這是一個具體的類,但他沒有提供寫進程需要依賴在其構造函數中。 – Tallmaris

+0

這是DI的權利,所以我要求在性能類的構造函數LogWriter(具體實現ILogWriter)? – rism

+0

是的,的確是你,我一定想象得那樣。那麼LogWriter有沒有無參數的構造函數? –

0

LogWriter沒有空的構造函數或具有所有具體類型參數的構造函數:LogWriter Constructor

所以Unity在構建它時失敗了,就像它說的那樣,它需要你的幫助,通過配置容器來提供一個實現。

作爲確認,ExceptionManager可能會解決好的,因爲它只有一個constructor,參以及:)

+0

嗯你說什麼是有道理的,但我不記得有關自己與構造函數關於Ent Lib塊的類型。 – rism

0

試試這個:

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

      } 
     }