I have a code which look something like this. When trying to do a ResolveAll
I expected every type registered with the IParserType
to yielded from the container instance. But I didn't get any instance from Unity
. Am I assuming or doing something wrong here.
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
}
You are not registering 3 different implementations of IParser
. You create one default mapping IParser
-> SuperParser
and then overwrite it with IParser
-> DefaultParser
and then you overwrite it again with IParser
-> BasicParser
.
If you want to register all three of them you have to provide named registrations like
container.RegisterType<IParser, SuperParser>("Super");
container.RegisterType<IParser, DefaultParser>("Default");
container.RegisterType<IParser, BasicParser>("Basic");
In addition ResolveAll
does not include the default mapping (the one without a name). It only resolves those mappings of IParser
that were registered as named mappings.
You need to register your parsers with a name, if you want to resolve all Parsers from the container.
Here´s the update code from your 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);
}
}
Note:
There is no need for the following code, cause the container registers itself during construction of the container.
container.RegisterInstance<IUnityContainer>(container);
// not needed cause UnityContainer registers itself on construction
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With