ResolveAll无法正常工作

Ars*_*han 24 c# unity-container

我有一个看起来像这样的代码.当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
}
Run Code Online (Sandbox Code Playgroud)

Seb*_*ber 51

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

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

container.RegisterType<IParser, SuperParser>("Super");
container.RegisterType<IParser, DefaultParser>("Default");
container.RegisterType<IParser, BasicParser>("Basic");
Run Code Online (Sandbox Code Playgroud)

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

  • 这确实是有价值的信息.以这种方式表现的统一没有任何意义 (2认同)

Jeh*_*hof 14

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

这是构造函数的更新代码:

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);
  }
}
Run Code Online (Sandbox Code Playgroud)

注意:

不需要以下代码,导致容器在构造容器期间自行注册.

container.RegisterInstance<IUnityContainer>(container);
// not needed cause UnityContainer registers itself on construction
Run Code Online (Sandbox Code Playgroud)