Mam kod, który wygląda mniej więcej tak. Kiedy próbowałem zrobić ResolveAll
oczekiwałem, że każdy typ zarejestrowany przy użyciu IParserType
będzie pochodził z instancji kontenera. Ale nie dostałem żadnej instancji od Unity
. Czy zakładam tutaj coś złego?ResolveAll nie działa
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
}
Czy wiesz, czy fakt, że wartość domyślna nie została zwrócona, jest zgodna z projektem, czy jest to błąd? –
@NicolasIrisarri Oprócz tego, że jest w kodzie źródłowym od co najmniej wersji 1.2, myślę, że jest to zgodne z projektem. Możesz łatwo obejść go, jeśli ponownie zarejestrujesz domyślne mapowanie z nazwą (np. "Default"). –
to naprawdę jest cenna informacja. Jedność zachowująca się w ten sposób nie ma żadnego sensu. – vip32