Search code examples
c#unity-container

Unity IOC configuration with json


In the app.config, it can look like below and the services and repositories are defined in a different file Unity.config. My question is, is it possible to do below in appsettings.json instead of app.config and Unity.json instead of Unity.config?

app.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <configSections>
        <section name="Unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" requirePermission="false" restartOnExternalChanges="true" />
    </configSections>
    <Unity configSource="Config\Unity.config"/>
    <appSettings>
        <add key="DateFormat" value="yyyyMMdd"/>
    </appSettings>
</configuration>

Unity.config

<Unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
    <alias alias="IHelpfulRepository" type="Repositories.IHelpfulRepository, Repositories" />
    <alias alias="HelpfulRepository" type="Repositories.Implementation.HelpfulRepository, Repositories" />
</Unity>

Solution

  • no it's not possible. there is a work around.

    So what I had to do was make my own UnityContainerExtensions class, load an xml file that looks just like an app.config file, get the unity section, and convert that to a UnityConfigurationSection. code below

    MyUnityContainerExtensions.cs

    public static class MyUnityContainerExtensions
    {
        public static IUnityContainer LoadXML(this IUnityContainer container, string xmlFilePath = ".\\Config\\Unity.config")
        {
            XmlDocument doc = new XmlDocument();
            doc.Load(xmlFilePath);
            var fileMap = new ExeConfigurationFileMap { ExeConfigFilename = xmlFilePath };
            Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
            UnityConfigurationSection section = (UnityConfigurationSection)configuration.GetSection("unity");
            return section.Configure(container, string.Empty);
        }
    }
    

    Unity.config

    <configuration>
        <configSections>
            <section name="Unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Unity.Configuration" requirePermission="false" restartOnExternalChanges="true" />
        </configSections>
        <Unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
            <alias alias="IHelpfulRepository" type="Repositories.IHelpfulRepository, Repositories" />
            <alias alias="HelpfulRepository" type="Repositories.Implementation.HelpfulRepository, Repositories" />
        </Unity>
        ...
    </configuration>
    

    Then where I'm loading the unity configuration, I just call the new extension method.

    IUnityContainer container = new UnityContainer().LoadXML();