c# - type - ResolveAll no funciona
unity lifetime lifetimemanager (2)
Tengo un código que se parece a esto. Al intentar hacer un ResolveAll
, esperaba que todos los tipos registrados con IParserType
obtuvieran de la instancia del contenedor. Pero no conseguí ningún ejemplo de Unity
. ¿Estoy asumiendo o haciendo algo mal aquí?
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
}
Debe registrar sus analizadores con un nombre, si desea resolver todos los analizadores del contenedor.
Aquí está el código de actualización de su constructor:
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);
}
}
Nota:
No es necesario el siguiente código, ya que el contenedor se registra durante la construcción del contenedor.
container.RegisterInstance<IUnityContainer>(container);
// not needed cause UnityContainer registers itself on construction
No estás registrando 3 implementaciones diferentes de IParser
. Crea un IParser
mapeo predeterminado -> SuperParser
y luego lo sobrescribe con IParser
-> DefaultParser
y luego lo sobrescribe nuevamente con IParser
-> BasicParser
.
Si desea registrar los tres, debe proporcionar registros con nombre como
container.RegisterType<IParser, SuperParser>("Super");
container.RegisterType<IParser, DefaultParser>("Default");
container.RegisterType<IParser, BasicParser>("Basic");
Además, ResolveAll
no incluye la asignación predeterminada (la que no tiene nombre). Solo resuelve las asignaciones de IParser
que se registraron como asignaciones con nombre.