Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Решить все не работает

Автор вопроса: Arshad Badar KhanОтветов: 2

У меня есть код, который выглядит примерно так. При попытке сделать ResolveAll я ожидал, что каждый тип, зарегистрированный с помощью IParserType, будет получен из экземпляра контейнера. Но я не получил ни одного экземпляра от Unity. Я предполагаю или делаю что-то неправильно здесь.

public class ResolveAllDemo
{
    public ResolveAllDemo()
    {
        var container = new UnityContainer();

        container.RegisterInstance<IUnityContainer>(container);
        container.RegisterType<IParser, SuperParser>();
        container.RegisterType<IParser, DefaultParser>();
        container.RegisterType<IParser, BasicParser>();
        //   container.RegisterType<Crawler>();
        container.RegisterType<IParserFactory, UnityParserFactory>();

        foreach (var registeredMember in container.ResolveAll<IParser>())
        {
            LoggingUtility.LogerInstance.Logger.Write(registeredMember);
        }
    }

    #region Resolve Demo

    public interface IParserFactory
    {
        IEnumerable<IParser> BuildParsers();
    }

    public class UnityParserFactory : IParserFactory
    {
        private IUnityContainer _container;

        public UnityParserFactory(IUnityContainer container)
        {
            _container = container;
        }

        public IEnumerable<IParser> BuildParsers()
        {
            return _container.ResolveAll<IParser>();
        }
    }

    public class DefaultParser : IParser
    {
        public override string ToString()
        {
            return "DefaultParser";
        }
    }

    public class BasicParser : IParser
    {
        public override string ToString()
        {
            return "BasicParser";
        }
    }

    public class SuperParser : IParser
    {
        public override string ToString()
        {
            return "SuperParser";
        }
    }

    public interface IParser
    {
    }

    #endregion Resolve Demo
}

unity-container

Ответы

Ответ 1 · рейтинг 55 · Sebastian Weber

Вы не регистрируете 3 разные реализации IParser. Вы создаете одно сопоставление по умолчанию IParser -> SuperParser, затем перезаписываете его IParser -> DefaultParser, а затем снова перезаписываете его IParser -> BasicParser.

Если вы хотите зарегистрировать все три из них, вы должны предоставить именованные регистрации, например

container.RegisterType<IParser, SuperParser>("Super");
container.RegisterType<IParser, DefaultParser>("Default");
container.RegisterType<IParser, BasicParser>("Basic");

Кроме того, ResolveAll не включает сопоставление по умолчанию (без имени). Он разрешает только те сопоставления IParser, которые были зарегистрированы как именованные сопоставления.

Ответ 2 · рейтинг 15 · Jehof

Вам нужно зарегистрировать свои парсеры с именем, если вы хотите разрешить все парсеры из контейнера.

Вот код обновления из вашего конструктора:

public ResolveAllDemo()
{

  var container = new UnityContainer();

  container.RegisterType<IParser, SuperParser>("SuperParser");
  container.RegisterType<IParser, DefaultParser>("DefaultParser");
  container.RegisterType<IParser, BasicParser>("BasicParser");

  container.RegisterType<IParserFactory, UnityParserFactory>();

  foreach (var registeredMember in container.ResolveAll<IParser>())
  {
     LoggingUtility.LogerInstance.Logger.Write(registeredMember);
  }
}

Примечание.

В следующем коде нет необходимости, потому что контейнер регистрируется во время создания контейнера.

container.RegisterInstance<IUnityContainer>(container);
// not needed cause UnityContainer registers itself on construction

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы