Проблема разрешения Unity при настройке через xml с именованной зарегистрированной зависимостью - PullRequest
0 голосов
/ 14 декабря 2010

У меня есть интерфейс, который принимает универсальный тип

interface IIFace<T>

Тогда у меня есть несколько реализаций

public class IFaceImp1 : IIFace<MyObj> {}
public class IFaceImp2 : IIFace<MyObj> {}

Я определил модель представления, которая вставляет в нее объект этого интерфейса для определенного типа ...

public MainViewModel(IIFace<MyObj> scrapper) { }

А потом я настраиваю Unity, чтобы заполнить его

<containers>
    <container>
        <register type="IIFace[MyObj]" mapTo="IFaceImp1">
            <constructor>
                <param name="loc" value="i am just a mock">
                </param>
            </constructor>
        </register>
    </container>
</containers>

Это отлично работает Проблема в том, что теперь я хотел создать именованные регистрации, чтобы потом я мог разрешить их по имени ... Поэтому я назвал его и сначала создал еще одну, но она не работала. Я уменьшил проблему до этого:

<containers>
    <container>
        <register type="IIFace[MyObj]" mapTo="IFaceImp1" name="FirstImplementation">
            <constructor>
                <param name="loc" value="i am just a mock">
                </param>
            </constructor>
        </register>
    </container>
</containers>

Что также не работает ... при попытке Разрешить <> ("Первая реализация"). Однако, если я удаляю атрибут name и использую перегрузку Resolve <> (), он работает нормально .. Любые идеи о том, что может случиться, что это имя не работает ??

1 Ответ

0 голосов
/ 14 декабря 2010

Хорошо, я выяснил, в чем проблема Мне нужно было использовать тег, создавая мою объектную модель в XML конечный результат примерно такой:

<containers>
    <container>

        <register type="ViewModelBase" mapTo="MainViewModel" name="MockMainViewModel">
          <constructor>
            <param name="imp">
              <dependency name="FirstImplementation" />
            </param>
          </constructor>
        </register>

        <register type="IIFace[MyObj]" mapTo="IFaceImp1" name="FirstImplementation">
            <constructor>
                <param name="loc" value="i am just a mock">
                </param>
            </constructor>
        </register>
    </container>
</containers>

Таким образом, эта конфигурация сообщает Unity, когда она вызывается с помощью Resolve («MockMainViewModel»), создает его и разрешает (через зависимость тоже) параметр, который нуждается в его конструкторе, с указанным именем («FirstImplementation») Я в основном не знал о теге, но в любом случае это может быть полезно для кого-то, кто сталкивается с той же проблемой и не знает, почему разрешение не работает автоматически, и каков правильный подход.

...