Unity:无法构造LogWriter类型

时间:2012-10-18 08:44:45

标签: c# unity-container

对于以下“项目”,我在解析Unity for DI时会遇到一个非常烦人且无法解释的错误。

  

InvalidOperationException - 无法构造LogWriter类型。   您必须配置容器以提供此值。

     ?

ex.Message; “依赖项的解析失败,类型=   \“WindowsFormsApplication1.Performance \”,name =   \“(无)\”。\ r \ n发生以下情况时发生异常:解析时。\ r \ n \ nException   是:InvalidOperationException - LogWriter类型不能   建造。您必须配置容器以提供此功能   值。\ r \ n -------------------------------------------- --- \ r \ nAtt   异常时间,容器是:\ r \ n \ r \ n解析   WindowsFormsApplication1.Performance,(none)\ r \ n解析参数   “lw”的构造函数   WindowsFormsApplication1.Performance(Microsoft.Practices.EnterpriseLibrary.Logging.LogWriter   LW,   Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.ExceptionManager   em)\ r \ n解析   Microsoft.Practices.EnterpriseLibrary.Logging.LogWriter,(无)\ r \ n“个

     ?

ex.StackTrace; “ 在   Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t,Object   现有的,String名称,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:\构建\统一\ UnityTemp \编译\统一\统一\ SRC \ UnityContainer.cs:线   485 \ r \ n在Microsoft.Practices.Unity.UnityContainer.Resolve(类型t,   字符串名称,ResolverOverride [] resolverOverrides)in   E:\构建\统一\ UnityTemp \编译\统一\统一\ SRC \ UnityContainer.cs:线   173 \ r \ n at   Microsoft.Practices.Unity.UnityContainerExtensions.Resolve [T](IUnityContainer   容器,ResolverOverride []覆盖)in   E:\构建\统一\ UnityTemp \编译\统一\统一\ SRC \ UnityContainerExtensions.cs:线   504 \ r \ n在WindowsFormsApplication1.Form1.OnLoad(EventArgs e)中   D:\ Devzone \ Tasking \ 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>

5 个答案:

答案 0 :(得分:11)

您需要将Enterprise Library扩展添加到容器中。没有它,容器不会读取配置文件,因此不知道如何创建Entlib对象,如LogWriter。

答案 1 :(得分:1)

Activation error occured while trying to get instance of type LogWriter, key ""

检查你的配置文件,它必须有正确的默认'loggingConfiguration'部分

答案 2 :(得分:0)

为了让Unity构建你的Performance类,它需要知道如何构造ILogWriter的实现。

我无法在代码中看到你告诉Unity要为ILogWriter接口创建什么类,所以我怀疑你可能需要添加它。

答案 3 :(得分:0)

LogWriter没有空构造函数或具有所有具体类型参数的构造函数:LogWriter Constructor

因此Unity无法构建它,正如它所说,它需要您的帮助,通过配置容器来提供实现。

作为确认,ExceptionManager可能会被解决,因为它只有一个constructor,无参数:)

答案 4 :(得分: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)
            {

            }
        }