Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Unity:无法构造类型LogWriter_C#_Unity Container - Fatal编程技术网

C# Unity:无法构造类型LogWriter

C# Unity:无法构造类型LogWriter,c#,unity-container,C#,Unity Container,对于下面的“项目”,在为DI解析Unity时,我遇到了一个非常恼人且无法解释的错误 InvalidOperationException-无法构造类型LogWriter。 必须配置容器以提供此值 ?例如信息;依赖项解析失败,请键入= \“WindowsFormsApplication1.Performance\”,名称= \“(无)\”\r\n在解析时发生异常。\r\n异常 is:InvalidOperationException-类型LogWriter不能为 已构造。必须配置容器以提供此 值。\

对于下面的“项目”,在为DI解析Unity时,我遇到了一个非常恼人且无法解释的错误

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

?例如信息;依赖项解析失败,请键入= \“WindowsFormsApplication1.Performance\”,名称= \“(无)\”\r\n在解析时发生异常。\r\n异常 is:InvalidOperationException-类型LogWriter不能为 已构造。必须配置容器以提供此 值。\r\n--------------------------------------------\r\n在 发生异常时,容器为:\r\n\r\n WindowsFormsApplication1.Performance,(无)\r\n解析参数 \构造函数的“lw\” WindowsFormsApplication1.性能(Microsoft.Practices.EnterpriseLibrary.Logging.LogWriter) lw, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.ExceptionManager em)\r\n正在解析 Microsoft.Practices.EnterpriseLibrary.Logging.LogWriter,(无)\r\n

?例如StackTrace;“在 Microsoft.Practices.Unity.UnityContainer.DoBuildUp(类型t,对象 现有,字符串名称,IEnumerable
1 resolverOverrides)
e:\\Builds\\Unity\\UnityTemp\\Compile\\Unity\\Unity\\Src\\UnityContainer.cs:line
515\r\n在Microsoft.Practices.Unity.UnityContainer.DoBuildUp(键入
t、 字符串名称,IEnumerable
1 resolverOverrides) e:\Builds\Unity\UnityTemp\Compile\Unity\Unity\Src\UnityContainer.cs:line 485\r\n在Microsoft.Practices.Unity.UnityContainer.Resolve(类型t, 中的字符串名称,ResolverOverride[]resolverOverrides) e:\Builds\Unity\UnityTemp\Compile\Unity\Unity\Src\UnityContainer.cs:line 173\r\n在 Microsoft.Practices.Unity.UnityContainerExtensions.Resolve[T](IUnityContainer) 容器中的ResolverOverride[]覆盖) e:\Builds\Unity\UnityTemp\Compile\Unity\Unity\Src\UnityContainerExtensions.cs:line 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)
            {

            }
        }
配置文件:

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

为了让Unity构建性能类,它需要知道如何构建ILogWriter的实现


我看不到您的代码中有任何地方告诉Unity要为ILogWriter接口创建什么类,因此我怀疑您可能需要添加这个类。

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

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

作为确认,ExceptionManager可能会被解析为ok,因为它只有一个,也没有参数:)

尝试以下操作:

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

            }
        }
protected override void OnLoad(事件参数e)
{
基础荷载(e);
尝试
{
IUnityContainer容器=新的UnityContainer();
container.RegisterType();
container.RegisterType();
RegisterType(新注入构造函数(typeof(ILogWriter)、typeof(ExceptionManager));
性能p=container.Resolve();
}
捕获(例外情况除外)
{
}
}

您需要将企业库扩展添加到容器中。没有企业库扩展,容器将无法读取配置文件,因此不知道如何创建Entlib对象,如LogWriter。


检查您的配置文件,它必须有正确的默认“loggingConfiguration”部分

他没有使用ILogWriter,而是使用LogWriter,这是一个具体的类,但他没有提供LogWriter在其构造函数中所需的依赖项。这是对的,所以我要求使用LogWriter(ILogWriter的具体实现)在性能类的构造函数中?是的,你确实是,我一定是这么想的。那么LogWriter有无参数构造函数吗?没有Chris。我肯定有很多方法可以做到这一点,但我记得他的方法很简单。Unity“只知道”关于Ent Libs构造函数,如果你给它提供一个EntLib扩展,我想这是一种映射?嗯,你说的有道理,但我不记得自己曾经关心过来自Ent Lib块的类型的构造函数。对于其他人,这就是我所需要做的:var container=new UnityContainer().AddNewExtension();我花了一些时间才弄明白,但这个答案非常有用。如果有人想在unity.config文件中声明它,应该这样做:EnterpriseLibraryCoreExtension已从企业库6中删除。您可以调用factory构造函数并传递ConfigurationSourceFactory。迁移指南中的详细信息:@谢谢!你的评论值得作为答案发布!
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)
            {

            }
        }