Asp. Net Как получить Unity Container из внешнего файла конфигурации? - PullRequest
0 голосов
/ 24 апреля 2020

В asp. net web api, используя Unity, я могу зарегистрировать свои сервисы в UnityConfig.cs:

public static class UnityConfig
{
    public static void RegisterComponents()
    {
        var container = new UnityContainer();
        container.RegisterType<ITestService, TestService>();
        //above code needs to be read from config file

        GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container);
    }
}

Теперь у меня есть файл конфигурации (находится в root проекта), где хранятся все эти типы для регистрации:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
  <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"/>
</configSections>


<unity>

  <alias alias="ITestService" type="IMyServices.ITestService, IMyServices" />

  <container>

    <register type="ITestService" mapTo="MyServices.TestService,MyServices" />

  </container>
</unity>
</configuration>

Как я могу получить контейнер из этого файла?

Ниже приведен аналогичный вопрос, но он не был решен: ASP. NET - Unity - чтение раздела конфигурации из внешнего файла конфигурации

1 Ответ

0 голосов
/ 26 апреля 2020

Я нашел решение моей проблемы, которое использует ExeConfigurationFileMap для указания пути к файлу и явной загрузки указанного файла конфигурации.

public static class UnityConfig
{
    public static void RegisterComponents()
    {
        ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
        fileMap.ExeConfigFilename = "my/file/path";

        Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
        var section = (UnityConfigurationSection)configuration.GetSection("unity");

        IUnityContainer unityContainer = new UnityContainer();

        unityContainer.LoadConfiguration(section);

        GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(unityContainer);
    }
}
...