unity type register management lifetimemanager ioc injection dependency container c# unity-container

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.