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

Error when Registering type with Unity through configuration file

这是我的配置文件:

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

错误信息是:

An unhandled exception of type 'System.InvalidOperationException' occurred in Microsoft.Practices.Unity.Configuration.dll

Additional information: The type name or alias CalculatorLibrary.Calculator, CalculatorLibrary could not be resolved. Please check your configuration file and verify this type name.

如果我在没有配置文件的情况下在我的 Main() 方法中使用它,那么它工作正常:

container.RegisterType<ICalculator, Calculator>();
        container.RegisterType<IInputService, ConsoleInputService>();
        container.RegisterType<IOutputService, ConsoleOutputService>();
        container.RegisterType<IInputParserService, InputParserService>();

当您以编程方式注册 类 时,Visual Studio 可以看到硬依赖项,并在编译期间将所有相关程序集复制到输出目录,以便可以在运行时解析类型。

但是,在使用配置时,Visual Studio 不知道(软)依赖项。因此,即使添加了引用,Visual Studio 也不会复制配置文件所需的适当程序集,Unity 会抛出一个异常,说明它无法解析类型。即 InterfacesLibrary 被复制,但其他实现程序集未被复制,因为它们从未在代码中被引用。

一个解决方案是添加一个 post 构建事件来复制仅通过配置引用的所有必需程序集。另一种方法是在代码中引用程序集,以便 Visual Studio 将看到依赖项并复制程序集。典型的方法是这样的:

// Force copy of soft dependency CalculatorLibrary assembly
private static Type calculatorType = typeof(CalculatorLibrary.Calculator);