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

最佳答案

您没有注册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映射。

关于c# - 解决所有不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9124629/

10-17 02:18