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