c# - ResolveAll 不工作

标签 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
}

最佳答案

您没有注册 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# - ResolveAll 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9124629/

相关文章:

c# - 将 ViewModel 传递到 CSS 文件中

c# - 从内部类访问外部类字段

c# - Entity Framework - 使用 Web.Config 连接字符串

c# - 在依赖解析期间获取类类型

c# - Unity Container 同一接口(interface)的多种实现

asp.net-mvc-3 - 使用 Unity 容器时,没有为此对象定义无参数构造函数异常

c# - MVVM Light + Unity 还是 Prism?

c# - 命名空间 System.Windows.Automation 的用途是什么

c# - 无法解析Packages/manifest.json

Unity 2.0 中的 XML 配置更改