ResolveAll not working

本文关键字:working not ResolveAll | 更新日期: 2023-09-27 18:22:24

我有一个代码,看起来像这样。当尝试执行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
}

ResolveAll not working

您没有注册IParser的3种不同实现。您创建一个默认映射IParser->SuperParser,然后用IParser->DefaultParser覆盖它,然后再用IParser->BasicParser再次覆盖它。

如果你想注册所有三个,你必须提供像这样的命名注册

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

此外,ResolveAll不包括默认映射(没有名称的映射)。它只解析那些注册为命名映射的IParser映射。

如果要从容器中解析所有解析器,则需要使用名称注册解析器。

以下是您的构造函数的更新代码:

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