这是我的配置文件:
<?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>
和主要方法:
static void Main(string[] args)
{
UnityContainer container = new UnityContainer();
UnityConfigurationSection configSection = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
configSection.Configure(container, string.Empty);
ICalculatorReplLoop loop = container.Resolve<ICalculatorReplLoop>();
loop.Run();
}
它在这里失败了:
configSection.Configure(container, string.Empty);
,错误信息为:
未处理的类型&#39; System.InvalidOperationException&#39; 发生在Microsoft.Practices.Unity.Configuration.dll
中其他信息:类型名称或别名 CalculatorLibrary.Calculator,CalculatorLibrary无法解析。 请检查您的配置文件并验证此类型名称。
如果我在没有配置文件的Main()方法中使用它,那么它可以正常工作:
container.RegisterType<ICalculator, Calculator>();
container.RegisterType<IInputService, ConsoleInputService>();
container.RegisterType<IOutputService, ConsoleOutputService>();
container.RegisterType<IInputParserService, InputParserService>();
答案 0 :(得分:2)
当您以编程方式注册类时,Visual Studio可以看到硬依赖项,并在编译期间将所有相关程序集复制到输出目录,以便可以在运行时解析类型。
但是,使用配置时,Visual Studio不了解(软)依赖项。因此,即使添加了引用,Visual Studio也不会复制配置文件所需的相应程序集,Unity会抛出一个异常,说它无法解析该类型。即复制InterfacesLibrary但不复制其他实现程序集,因为它们从未在代码中引用。
一种解决方案是添加post build事件以复制仅通过配置引用的所有必需程序集。另一种方法是在代码中引用程序集,以便Visual Studio将查看依赖项并复制程序集。典型的方法是这样的:
// Force copy of soft dependency CalculatorLibrary assembly
private static Type calculatorType = typeof(CalculatorLibrary.Calculator);