Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 这一切都不起作用_C#_Unity Container - Fatal编程技术网

C# 这一切都不起作用

C# 这一切都不起作用,c#,unity-container,C#,Unity Container,我有一个类似这样的代码。当尝试执行ResolveAll时,我希望使用IParserType注册的每个类型都从容器实例中生成。但是我没有从Unity获得任何实例。我是在假设还是在做错事 public class ResolveAllDemo { public ResolveAllDemo() { var container = new UnityContainer(); container.RegisterInstance<IUnityCon

我有一个类似这样的代码。当尝试执行
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
}
公共类ResolveAllDemo
{
公共ResolveAllDemo()
{
var container=new UnityContainer();
容器。注册表状态(容器);
container.RegisterType();
container.RegisterType();
container.RegisterType();
//container.RegisterType();
container.RegisterType();
foreach(容器中的var registeredMember.ResolveAll())
{
LoggingUtility.LogerInstance.Logger.Write(registeredMember);
}
}
#区域解析演示
公共接口IParserFactory
{
IEnumerable BuildParsers();
}
公共类UnityParserFactory:IParserFactory
{
专用IUnityContainer\u容器;
公共UnityParserFactory(IUnityContainer容器)
{
_容器=容器;
}
公共IEnumerable构建分析器()
{
返回_container.ResolveAll();
}
}
公共类DefaultParser:IParser
{
公共重写字符串ToString()
{
返回“DefaultParser”;
}
}
公共类基本资源:IParser
{
公共重写字符串ToString()
{
返回“BasicPasser”;
}
}
公共类超级parser:IParser
{
公共重写字符串ToString()
{
返回“超级帕尔默”;
}
}
公共接口IParser
{
}
#端域解析演示
}

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

如果您想注册这三个项目,您必须提供命名注册,如

container.RegisterType<IParser, SuperParser>("Super");
container.RegisterType<IParser, DefaultParser>("Default");
container.RegisterType<IParser, BasicParser>("Basic");
container.RegisterType(“超级”);
container.RegisterType(“默认”);
容器注册表类型(“基本”);

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

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

container.RegisterInstance<IUnityContainer>(container);
// not needed cause UnityContainer registers itself on construction
以下是您的构造函数的更新代码:

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);
  }
}
public ResolveAllDemo()
{
var container=new UnityContainer();
container.RegisterType(“超级parser”);
RegisterType(“DefaultParser”);
容器注册器类型(“基本注册器”);
container.RegisterType();
foreach(容器中的var registeredMember.ResolveAll())
{
LoggingUtility.LogerInstance.Logger.Write(registeredMember);
}
}
注意:

不需要下面的代码,因为容器在构建容器时会自动注册

container.RegisterInstance<IUnityContainer>(container);
// not needed cause UnityContainer registers itself on construction
container.RegisterInstance(容器);
//不需要,因为UnityContainer在构造时注册自身

谢谢你,你的回答真的帮我省了很多调试时间!你知道默认值没有返回是出于设计还是一个bug吗?@NicolasIrisarri除了它在代码库中之外,至少在v1.2版,我相信这是出于设计。如果您用一个名称(例如“default”)再次注册默认映射,您可以很容易地解决这个问题。这确实是有价值的信息。unity的这种行为不会让任何老师认为unity真的应该抛出一个异常,而不仅仅是owerwriting,或者更好地使默认行为是unity将注册的类型注册为名称。@JonasTensed其他容器记住多个注册为默认值,并使用它在解析时创建对象链。统一覆盖了这个注册。不同的容器,不同的行为。但您始终可以扩展Unity以匹配您的偏好。