解决所有不工作 [英] ResolveAll not working

查看:19
本文介绍了解决所有不工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个看起来像这样的代码.在尝试执行 ResolveAll 时,我希望使用 IParserType 注册的每个类型都从容器实例中产生.但是我没有从 Unity 得到任何实例.我在这里假设或做错了什么.

I have a code which look something like this. When trying to do a ResolveAll I expected every type registered with the IParserType to yielded from the container instance. But I didn't get any instance from Unity. Am I assuming or doing something wrong here.

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
}

推荐答案

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

You are not registering 3 different implementations of IParser. You create one default mapping IParser -> SuperParser and then overwrite it with IParser -> DefaultParser and then you overwrite it again with IParser -> BasicParser.

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

If you want to register all three of them you have to provide named registrations like

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

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

In addition ResolveAll does not include the default mapping (the one without a name). It only resolves those mappings of IParser that were registered as named mappings.

这篇关于解决所有不工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆