ResolveAll не работает
У меня есть код, который выглядит примерно так. При попытке выполнить 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
}
Ответы
Ответ 1
Вы не регистрируете 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
Вам нужно зарегистрировать ваши парсеры с именем, если вы хотите разрешить все Parsers из контейнера.
Вот код обновления от вашего конструктора:
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