2012-10-18 31 views
6

Đối với "dự án" sau đây, tôi nhận được một lỗi rất khó chịu và không thể giải thích khi giải quyết Unity cho DI.Unity: Loại LogWriter không thể được xây dựng

InvalidOperationException - Loại LogWriter không thể được tạo. Bạn phải định cấu hình vùng chứa để cung cấp giá trị này.

? Ex.Message; "Độ phân giải của phụ thuộc không thành công, hãy nhập = \" WindowsFormsApplication1.Performance \ ", name = \" (không có) \ ". \ R \ nBắt đầu xảy ra khi: trong khi giải quyết. \ R \ nException là: InvalidOperationException - Loại LogWriter không thể được xây dựng . Bạn phải định cấu hình vùng chứa để cung cấp giá trị này. \ R \ n ----------------------------- ------------------ \ r \ nTrong thời gian ngoại lệ là , vùng chứa là: \ r \ n \ r \ n Giải quyết WindowsFormsApplication1.Performance, (không có) \ r \ n Giải quyết tham số \ "lw \" của hàm tạo WindowsFormsApplication1.Performance (Microsoft.Practices.EnterpriseLibrary.Logging.LogWriter lw, Microsoft.Practices.EnterpriseLibrary.Exceptio nHandling.ExceptionManager em) \ r \ n Giải quyết Microsoft.Practices.EnterpriseLibrary.Logging.LogWriter, (none) \ r \ n "

? ex.StackTrace; "tại Microsoft.Practices.Unity.UnityContainer.DoBuildUp (Loại t, Object hiện tại, Tên chuỗi, 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) trong e: \ Builds \ Unity \ UnityTemp \ Biên dịch \ Unity \ Unity \ Src \ UnityContainer.cs : dòng 485 \ r \ n tại Microsoft.Practices.Unity.UnityContainer.Resolve (Loại t, Tên chuỗi, ResolverOverride [] resolverOverrides) trong e: \ Builds \ Unity \ UnityTemp \ Compile \ Unity \ Unity \ Src \ UnityContainer.cs: dòng 173 \ r \ n tại Microsoft.Practices.Unity.UnityContainerExtensions.Resolve [T] (IUnityContainer container, ResolverOverride [] ghi đè) trong e: \ Builds \ Unity \ UnityTemp \ Compile \ Unity \ Unity \ Src \ UnityContainerExtensions.cs: dòng 504 \ r \ n tại WindowsFormsApplication1.Form1.OnLoad (EventArgs e) trong D: \ Devzone \ Tasking \ WindowsFormsApplication1 \ Form1.cs: dòng 33"

Trong một hình thức:

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

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

      } 
     } 

lớp phụ thuộc:

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

Cấu hình file:

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

Trả lời

10

Bạn cần phải thêm phần mở rộng doanh nghiệp Thư viện để thùng chứa của bạn. Nếu không có nó, vùng chứa sẽ không đọc tệp cấu hình và do đó không biết cách tạo các đối tượng Entlib, như LogWriter.

+0

Arhhhhhhhhh !!! Tuyệt vời. Cảm ơn bạn đời. – rism

+1

Đối với bất cứ ai khác, đây là tất cả những gì tôi cần làm: var container = new UnityContainer(). AddNewExtension (); – rism

+0

Tôi mất một thời gian để tìm ra, nhưng câu trả lời này rất hữu ích. Nếu ai đó muốn khai báo nó trong một tập tin unity.config đây là cách nó nên được thực hiện: Konrad

0

Để Unity xây dựng lớp Performance của bạn, nó cần phải biết cách xây dựng việc thực thi ILogWriter.

Tôi không thể thấy bất kỳ nơi nào trong mã của bạn, nơi bạn cho Unity biết lớp nào sẽ tạo cho giao diện ILogWriter, vì vậy tôi nghi ngờ bạn có thể cần phải thêm điều này.

+0

Ông không sử dụng ILogWriter, nhưng LogWriter, mà là một lớp bê tông, nhưng ông không được cung cấp các phụ thuộc mà LogWriter đòi hỏi trong hàm tạo của nó. – Tallmaris

+0

Đây là DI đúng, vì vậy Im yêu cầu cho một LogWriter (một thực hiện cụ thể của ILogWriter) trong constructor của lớp Performance? – rism

+0

Đúng, đúng là bạn, tôi phải tưởng tượng điều đó. Vì vậy, có một constructor parameterless cho LogWriter? –

0

Trình ghi nhật ký không có hàm khởi tạo trống hoặc hàm tạo với tất cả các tham số kiểu cụ thể: LogWriter Constructor.

Vì vậy, Unity thất bại trong việc xây dựng nó và như nó nói, nó sẽ cần sự giúp đỡ của bạn bằng cách cấu hình container để cung cấp một thực hiện.

Là một xác nhận, ExceptionManager có thể sẽ được giải quyết ok, vì nó chỉ có một constructor, parameterless cũng :)

+0

Hmm những gì bạn đã nói có ý nghĩa nhưng tôi không nhớ bao giờ liên quan đến bản thân mình với các nhà xây dựng trên các loại từ các khối Ent Lib. – rism

0

Hãy thử điều này:

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

      } 
     } 
Các vấn đề liên quan