Не удалось разрешить вложенный словарь из XML через Castle Windsor - PullRequest
0 голосов
/ 04 июля 2018

Мне нужно разрешить следующую конфигурацию из файла конфигурации XML через Castle Windsor:

interface IMyConfiguration
{
    string Url { get; set; }
    string Token { get; set; }
    Dictionary <string, Dictionary <string, Guid>> Mapping { get; set; }
}

Из XML-файла:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <components>
        <component id="myConfiguration"
                   service="Application.IMyConfiguration, Application"
                   type="Application.MyConfiguration, Application">
            <parameters>
                <Url>example.com</Url>
                <Token>00000000-0000-0000-0000-000000000000</Token>
                <Mapping>
                    <dictionary>
                        <entry key="AA">${mapping_one}</entry>
                        <entry key="BB">${mapping_two}</entry>
                    </dictionary>
                </Mapping>
            </parameters>
        </component>

        <component id="mapping_one"
                   service="System.Collections.Generic.IDictionary`2[[System.String, mscorlib],[System.Guid, mscorlib]]"
                   type="System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[System.Guid, mscorlib]]">
            <parameters>
                <dictionary>
                    <dictionary>
                        <entry key="aa">00000000-0000-0000-0000-000000000000</entry>
                        <entry key="bb">00000000-0000-0000-0000-000000000000</entry>
                        <entry key="cc">00000000-0000-0000-0000-000000000000</entry>
                    </dictionary>
                </dictionary>
            </parameters>
        </component>

        <component id="mapping_two"
                   service="System.Collections.Generic.IDictionary`2[[System.String, mscorlib],[System.Guid, mscorlib]]"
                   type="System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[System.Guid, mscorlib]]">
            <parameters>
                <dictionary>
                    <dictionary>
                        <entry key="aa">00000000-0000-0000-0000-000000000000</entry>
                        <entry key="bb">00000000-0000-0000-0000-000000000000</entry>
                        <entry key="cc">00000000-0000-0000-0000-000000000000</entry>
                    </dictionary>
                </dictionary>
            </parameters>
        </component>
    </components>
</configuration>

Но я получаю Mapping свойство, установленное на null. Другие свойства разрешаются правильно.

Что я делаю не так? Как это сделать правильно?

Я пытался найти решение в Google, но, похоже, никто не использует вложенные словари для конфигурации:)

Лучшая идея, которую я получил, - использовать список вместо словаря.


UPD. Разрешение работает нормально, если я поместил mapping_one и mapping_two внутри компонента MyConfiguration.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <components>
        <component id="myConfiguration"
                   service="Application.IMyConfiguration, Application"
                   type="Application.MyConfiguration, Application">
            <parameters>
                <Url>example.com</Url>
                <Token>00000000-0000-0000-0000-000000000000</Token>
                <Mapping>
                    <dictionary>
                        <entry key="AA">
                            <dictionary>
                                <entry key="aa">00000000-0000-0000-0000-000000000000</entry>
                                <entry key="bb">00000000-0000-0000-0000-000000000000</entry>
                                <entry key="cc">00000000-0000-0000-0000-000000000000</entry>
                            </dictionary>
                        </entry>
                        <entry key="BB">
                            <dictionary>
                                <entry key="aa">00000000-0000-0000-0000-000000000000</entry>
                                <entry key="bb">00000000-0000-0000-0000-000000000000</entry>
                                <entry key="cc">00000000-0000-0000-0000-000000000000</entry>
                            </dictionary>
                        </entry>
                    </dictionary>
                </Mapping>
            </parameters>
        </component>
    </components>
</configuration>

Но я хочу, чтобы вложенные словари были отдельными компонентами.

1 Ответ

0 голосов
/ 05 июля 2018

Я делаю это все время дома, используя xml linq. У меня нет VS, поэтому я надеюсь, что синтаксис правильный

XDocument doc = XDocument("filename");

List<MyConfiguration> configs = doc.Descendants("parameters").Select(x => new MyConfiguration() {
   Url = (string)x.Descendants("Url").FirstOrDefault(),
   Token = (string)x.Descendants("Token").FirstOrDefault(),
   Mapping = x.Elements("Mapping").Select(m => m.Element("dictionary").Elements("entry")
             .GroupBy(y => (string)y.Attribute("key"), z => z.Descendants("entry")
                .GroupBy(a => (string)a.Attribute("key"), b => (string)b)
                .ToDictionary(a => a.Key, b => b.FirstOrDefault))
             .ToDictionary(y => y.Key, z => z.FirstOrDefault())
          .FirstOrDefault();

код, предполагающий класс

...