通过配置文件向Unity注册类型时出错

时间:2016-02-22 12:56:35

标签: 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"/>
  </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>();

1 个答案:

答案 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);