C# Unity:无法构造类型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,对象 现有,字符串名称,IEnumerableC# Unity:无法构造类型LogWriter,c#,unity-container,C#,Unity Container,对于下面的“项目”,在为DI解析Unity时,我遇到了一个非常恼人且无法解释的错误 InvalidOperationException-无法构造类型LogWriter。 必须配置容器以提供此值 ?例如信息;依赖项解析失败,请键入= \“WindowsFormsApplication1.Performance\”,名称= \“(无)\”\r\n在解析时发生异常。\r\n异常 is:InvalidOperationException-类型LogWriter不能为 已构造。必须配置容器以提供此 值。\
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}
Message: {message}{newline}
Category: {category}{newline}
Priority: {priority}{newline}
EventId: {eventid}{newline}
Severity: {severity}{newline}
Title:{title}{newline}
Machine: {localMachine}{newline}
App Domain: {localAppDomain}{newline}
ProcessId: {localProcessId}{newline}
Process Name: {localProcessName}{newline}
Thread Name: {threadName}{newline}
Win32 ThreadId:{win32ThreadId}{newline}
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 & 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)
{
}
}