DryIoc, эквивалент Spring.Net GetObjectsOfType?

С помощью Spring.Net можно запрашивать все объекты определенного (предкового) типа.

        var ctx = ContextRegistry.GetContext();

        var setUsers = ctx.GetObjectsOfType(typeof(ISetUser)).Values.OfType<ISetUser>().ToList();

Как это можно сделать с помощью DryIoc?


person Serge Intern    schedule 04.05.2016    source источник
comment
Как зарегистрированы ваши ISetUser? Я предполагаю, что вы уже пробовали ResolveMany.   -  person dadhi    schedule 04.05.2016
comment
Он не зарегистрирован, это просто интерфейс, который реализуют некоторые из моих зарегистрированных/сопоставленных классов.   -  person Serge Intern    schedule 05.05.2016


Ответы (1)


Прямой ответ с учетом примеров классов и интерфейсов:

public interface IA { }
public interface IB { }
public class AB : IA, IB { }
public class AA : IA { }

[Test]
public void Resolve_all_services_implementing_the_interface()
{
    var container = new Container();
    container.Register<IB, AB>();
    container.Register<AA>();

    // resolve IA's, even if no IA service type was registered
    var aas = container.GetServiceRegistrations()
        .Where(r => typeof(IA).IsAssignableFrom(r.Factory.ImplementationType ?? r.ServiceType))
        .Select(r => (IA)container.Resolve(r.ServiceType))
        .ToList();

    Assert.AreEqual(2, aas.Count);
}

Если вы хотите получить какой-то интерфейс, вероятно, было бы неплохо зарегистрировать его с самого начала (запланируйте это):

[Test]
public void Resolve_automatically_registered_interface_services()
{
    var container = new Container();

    // changed to RegisterMany to automatically register implemented interfaces as services
    container.RegisterMany<AB>();
    container.RegisterMany<AA>();

    // simple resolve
    var aas = container.Resolve<IList<IA>>();

    Assert.AreEqual(2, aas.Count);
}
person dadhi    schedule 06.05.2016