Ars*_*han 24 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
}
Run Code Online (Sandbox Code Playgroud)
Seb*_*ber 51
您没有注册3个不同的实现IParser.您创建一个默认映射IParser- > SuperParser然后用IParser- > DefaultParser覆盖它,然后用IParser- > 再次覆盖它BasicParser.
如果你想要注册所有这三个,你必须提供像这样的命名注册
container.RegisterType<IParser, SuperParser>("Super");
container.RegisterType<IParser, DefaultParser>("Default");
container.RegisterType<IParser, BasicParser>("Basic");
Run Code Online (Sandbox Code Playgroud)
此外ResolveAll,不包括默认映射(没有名称的映射).它只解析那些IParser注册为命名映射的映射.
Jeh*_*hof 14
如果要从容器中解析所有解析器,则需要使用名称注册解析器.
这是构造函数的更新代码:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
注意:
不需要以下代码,导致容器在构造容器期间自行注册.
container.RegisterInstance<IUnityContainer>(container);
// not needed cause UnityContainer registers itself on construction
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7201 次 |
| 最近记录: |