C# 通过配置文件向Unity注册类型时出错
这是我的配置文件:C# 通过配置文件向Unity注册类型时出错,c#,dependency-injection,unity-container,C#,Dependency Injection,Unity Container,这是我的配置文件: <?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"/>
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"/>
</configSections>
<unity>
<containers>
<container>
<types>
<type type="InterfacesLibrary.ICalculator, InterfacesLibrary" mapTo="CalculatorLibrary.Calculator, CalculatorLibrary"/>
<type type="InterfacesLibrary.ICalculatorReplLoop, InterfacesLibrary" mapTo="CalculatorLibrary.CalculatorReplLoop, CalculatorLibrary"/>
<type type="InterfacesLibrary.IInputService, InterfacesLibrary" mapTo="InputOutputLibrary.ConsoleInputService, InputOutputLibrary"/>
<type type="InterfacesLibrary.IOutputService, InterfacesLibrary" mapTo="InputOutputLibrary.ConsoleOutputService, InputOutputLibrary"/>
<type type="InterfacesLibrary.IInputParserService, InterfacesLibrary" mapTo="CalcCommandParsingLib.InputParserService, CalcCommandParsingLib"/>
</types>
</container>
</containers>
</unity>
</configuration>
错误消息是:
“System.InvalidOperationException”类型的未处理异常
发生在Microsoft.Practices.Unity.Configuration.dll中
其他信息:类型名称或别名
计算器库。无法解析计算器、计算器库。
请检查配置文件并验证此类型名称
如果在没有配置文件的Main()方法中使用此选项,则它可以正常工作:
container.RegisterType<ICalculator, Calculator>();
container.RegisterType<IInputService, ConsoleInputService>();
container.RegisterType<IOutputService, ConsoleOutputService>();
container.RegisterType<IInputParserService, InputParserService>();
container.RegisterType();
container.RegisterType();
container.RegisterType();
container.RegisterType();
以编程方式注册类时,Visual Studio可以查看硬依赖项,并在编译期间将所有相关程序集复制到输出目录,以便在运行时解析类型
但是,当使用配置时,VisualStudio不知道(软)依赖关系。因此,即使添加了引用,VisualStudio也不会复制配置文件所需的适当程序集,Unity会抛出一个异常,表示它无法解析该类型。i、 e.已复制InterfacesLibrary,但未复制其他实现程序集,因为它们从未在代码中引用
一种解决方案是添加生成后事件,以复制仅通过配置引用的所有必需程序集。另一种方法是在代码中引用程序集,以便VisualStudio看到依赖项并复制程序集。典型的方法如下所示:
// Force copy of soft dependency CalculatorLibrary assembly
private static Type calculatorType = typeof(CalculatorLibrary.Calculator);
谢谢你的回答。然而,我的例子来自这个视频:主要目标是不必使用配置文件引用“CalculatorLibrary”和所有其他库。它只是以某种方式在视频中神奇地工作——您不必引用CalculatorLibrary——您只需确保在运行时部署程序集。你想怎么做就怎么做。e、 硬参考、构建后命令、手动复制、部署脚本等。是的,完全正确。我刚刚检查了bin/debug文件夹,没有CalculatorLibrary.dll。我从以前的版本中手动复制了它,现在它可以工作了。谢谢你的帮助。
container.RegisterType<ICalculator, Calculator>();
container.RegisterType<IInputService, ConsoleInputService>();
container.RegisterType<IOutputService, ConsoleOutputService>();
container.RegisterType<IInputParserService, InputParserService>();
// Force copy of soft dependency CalculatorLibrary assembly
private static Type calculatorType = typeof(CalculatorLibrary.Calculator);