Unity не использует конструктор по умолчанию класса

У меня есть этот класс:

public class Repo
{
   public Repo() : this(ConfigurationManager.AppSettings["identity"],       ConfigurationManager.AppSettings["password"])

    {

    }

   public Repo(string identity,string password)
   {
       //Initialize properties.
   }

}

Я добавил строку в web.config, чтобы этот тип автоматически создавался контейнером Unity.

но во время выполнения моего приложения я получаю следующее сообщение об ошибке:

  "System.InvalidOperationException : the parameter identity could not be resolved when attempting to call constructor Repo(String identity, String password)  -->Microsoft.Practices.ObjectBuilder2.BuildFailedException : The current Build operation ...."

1) Почему Unity не использует конструктор по умолчанию?

2) Предположим, я хочу, чтобы Unity использовал второй конструктор (параметризованный), как мне     передать эту информацию Unity через файл конфигурации?

Ответы

Ответ 1

Unity по умолчанию выбирает конструктор с наибольшим количеством параметров. Вы должны сказать Unity явно использовать другое.

Один из способов сделать это - с атрибутом [InjectionConstructor] следующим образом:

using Microsoft.Practices.Unity;

public class Repo
{
   [InjectionConstructor]
   public Repo() : this(ConfigurationManager.AppSettings["identity"], ConfigurationManager.AppSettings["password"])
   {

   }

   public Repo(string identity,string password)
   {
       //Initialize properties.
   }
}

Второй способ сделать это, если вы против загромождения классов/методов с атрибутами, заключается в том, чтобы указать, какой конструктор использовать при настройке вашего контейнера, используя InjectionConstructor:

IUnityContainer container = new UnityContainer();
container.RegisterType<Repo>(new InjectionConstructor());

В документации :

Как единство разрешает конструкторы и параметры целей

Если целевой класс содержит более одного конструктора, Unity будет использовать тот, который имеет атрибут InjectionConstructor. Если здесь является более чем одним конструктором, и ни один из них не имеет Атрибут InjectionConstructor, Unity будет использовать конструктор с большинство параметров. Если существует более одного такого конструктора (более чем один из "самых длинных" с одинаковым количеством параметров), Unity приведет к возникновению исключения.

Ответ 2

Просто попробуйте зарегистрировать тип следующим образом:

<register type="IRepo" mapTo="Repo">
  <constructor />
</register>

Из-за элемента param, указанного в элементе constructor, он должен вызывать конструктор по умолчанию.

Вы также можете сделать эту регистрацию в коде:

container.RegisterType<IRepo, Repo>(new InjectionConstructor());