使用 Prism 和 Unity 容器时激活错误

Activation error when using Prism and Unity container

我有以下控制台程序,我尝试在其中应用 SOLID 原则、Unity 依赖注入和 Prism 6 模块化:

主程序:

UnityContainer container = new UnityContainer();

            container.RegisterInstance<IServiceLocator>(new UnityServiceLocator(container));

            container.RegisterType<IModuleInitializer, ModuleInitializer>();

            TextLogger logger = new TextLogger();
            container.RegisterInstance<ILoggerFacade>(logger);

            ConfigurationModuleCatalog catalog = new ConfigurationModuleCatalog();
            container.RegisterInstance<IModuleCatalog>(catalog);

            container.RegisterType<IModuleManager, ModuleManager>();

            IModuleManager manager = container.Resolve<IModuleManager>();
            manager.Run();

应用程序配置文件:

<?xml version="1.0" encoding="utf-8"?>
<configuration>

  <configSections>
    <section name="modules" type="Prism.Modularity.ModulesConfigurationSection, Prism.Wpf" />
  </configSections>

  <modules>

    <module assemblyFile="CalcCommandParsingLib.dll" moduleType="CalcCommandParsingLib.CalculatorCommandParsingModule, CalcCommandParsingLib, Version=1.0.0.0, Culture = neutral, PublicKeyToken=null" moduleName="Parsing" />

    <module assemblyFile="CalculatorLibrary.dll" moduleType="CalculatorLibrary.CalculatorModule, CalculatorLibrary, Version=1.0.0.0, Culture = neutral, PublicKeyToken=null" moduleName="Calculator" />

    <module assemblyFile="InputOutputLibrary.dll" moduleType="InputOutputLibrary.InputOutputModule, InputOutputLibrary, Version=1.0.0.0, Culture = neutral, PublicKeyToken=null" moduleName="InputOutput" />

    <module assemblyFile="MainModuleLibrary.dll" moduleType="MainModuleLibrary.MainModule, MainModuleLibrary, Version=1.0.0.0, Culture = neutral, PublicKeyToken=null" moduleName="Main" >
      <dependencies>
        <dependency moduleName="Calculator" />
        <dependency moduleName="Parsing" />
        <dependency moduleName="InputOutput" />
      </dependencies>
    </module>

  </modules>

</configuration>

导致错误的四个模块之一:

public class MainModule : IModule
    {
        IServiceLocator serviceLocator;

        public MainModule(IServiceLocator serviceLocator)
        {
            this.serviceLocator = serviceLocator;
        }

        public void Initialize()
        {
            ICalculatorReplLoop loop = serviceLocator.GetInstance<ICalculatorReplLoop>();
            loop.Run();
        }
    }

错误发生在这一行:

ICalculatorReplLoop loop = serviceLocator.GetInstance<ICalculatorReplLoop>();

它是:

An exception of type 'Microsoft.Practices.ServiceLocation.ActivationException' occurred in Microsoft.Practices.ServiceLocation.dll but was not handled in user code

Additional information: Activation error occurred while trying to get instance of type ICalculatorReplLoop, key ""

有人可以帮我解决这个问题吗?

我认为至少有两点需要改变:

  1. 您还应该注册 ICalculatorReplLoop

    container.RegisterType<ICalculatorReplLoop, CalculatorReplLoop>();

  2. 我直接注入需要的接口,然后通过 serviceLocator 解析它会更有意义所以:

    public MainModule(ICalculatorReplLoop calc) { this.calc= calc; }