powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Autofac ResolveNamed но получить все зарегистрированные компоненты для интерфейса. Как ?
15 сообщений из 15, страница 1 из 1
Autofac ResolveNamed но получить все зарегистрированные компоненты для интерфейса. Как ?
    #39147755
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет.

Подскажите как в Autofac, имея IContainer, получить все сервисы зарегистрированные и реализующие конкретный интерфейс.
Мне нужно не достать какой-то один из них, а взять все, что были кем-то зарегистрированы, и последовательно вызвать каждый из них.

Т.е. имеем такой код:

Код: c#
1.
2.
3.
builder.Register<OnlineState>().Named<IDeviceState>("online");
...
var r = container.ResolveNamed<IDeviceState>("online");



а мне нужно взять все, что реализуют IDeviceState - не зная имен, и вообще количества - и пройтись по ним через foreach.
...
Рейтинг: 0 / 0
Autofac ResolveNamed но получить все зарегистрированные компоненты для интерфейса. Как ?
    #39147759
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы 2 раза не вставать.

У каждого из этих элементов, имеется определенный аттрибут.
Можно ли через Autofac создавать не через Keyed, Named, а через значение аттрибута.


Т.е. имеем классы
Код: c#
1.
2.
3.
4.
5.
[MyAttrAttr(Name:"Class1")]
class MyClass1: IInterface

[MyAttr(Name:"Class2")]
class MyClass2: IInterface



Можно ли отрезолвить резолвить по значению аттрибута MyAttr ?

PS. Первый вопрос для меня приоритетней. Второй чисто для интереса :)
...
Рейтинг: 0 / 0
Autofac ResolveNamed но получить все зарегистрированные компоненты для интерфейса. Как ?
    #39147848
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
var services = container.Resolve<IEnumerable<IMyService>>();
...
Рейтинг: 0 / 0
Autofac ResolveNamed но получить все зарегистрированные компоненты для интерфейса. Как ?
    #39147849
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
builder.RegisterType<Service1>().As<IMyService>();
builder.RegisterType<Service2>().As<IMyService>();
...
Рейтинг: 0 / 0
Autofac ResolveNamed но получить все зарегистрированные компоненты для интерфейса. Как ?
    #39148126
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К
Код: c#
1.
2.
builder.RegisterType<Service1>().As<IMyService>();
builder.RegisterType<Service2>().As<IMyService>();



Это к чему ?
Не нужно Named использовать что ли ? Но оно мне нужно.
...
Рейтинг: 0 / 0
Autofac ResolveNamed но получить все зарегистрированные компоненты для интерфейса. Как ?
    #39148130
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotekАлексей К
Код: c#
1.
2.
builder.RegisterType<Service1>().As<IMyService>();
builder.RegisterType<Service2>().As<IMyService>();



Это к чему ?
Не нужно Named использовать что ли ? Но оно мне нужно.Ну если нужно, то что мешает попробовать?
Код: c#
1.
var s = container.ResolveNamed<IEnumerable<IDeviceState>>("online");
...
Рейтинг: 0 / 0
Autofac ResolveNamed но получить все зарегистрированные компоненты для интерфейса. Как ?
    #39148172
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К,

Мне вот этот кажется подойдет (проверяю)
Код: c#
1.
var services = container.Resolve<IEnumerable<IMyService>>();



Я не понял для чего приведено
Код: c#
1.
2.
builder.RegisterType<Service1>().As<IMyService>();
builder.RegisterType<Service2>().As<IMyService>();


Регистрировать на один интерфейс различные сервисы, без возможности их фильтровать перед созданием (через named, keyed) мне кажется бессмысленным. Так мы лишаемся возможности указать, что создавать. Если нам нужен будет какой-то один, мы будем вынуждены создать все (траты на создание, инициализацию !), чтобы потом найти нужный - через какое-то его свойство, типа Name.

Вот и спросил, в чем смысл данной конструкции.
...
Рейтинг: 0 / 0
Autofac ResolveNamed но получить все зарегистрированные компоненты для интерфейса. Как ?
    #39148232
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К
Код: c#
1.
var services = container.Resolve<IEnumerable<IMyService>>();



К сожалению так не заработало... Возвращает пустой список
...
Рейтинг: 0 / 0
Autofac ResolveNamed но получить все зарегистрированные компоненты для интерфейса. Как ?
    #39148254
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может я не так регистрирую ?

Код: c#
1.
builder.RegisterType<DbLogger>().Named<ILogger>("1");



в документации показан такой пример
Код: c#
1.
builder.Register<OnlineState>().Named<IDeviceState>("online");



но он не компилируется - ругается, что метод Register требует 1 параметр.
...
Рейтинг: 0 / 0
Autofac ResolveNamed но получить все зарегистрированные компоненты для интерфейса. Как ?
    #39148260
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Причем
Код: c#
1.
2.
3.
            IEnumerable<ILogger> loggers = _сontainer.Resolve<IEnumerable<ILogger>>(); // возвращает пустой список

            var lll = _сontainer.ResolveNamed<ILogger>("1"); // выбрасывает исключение "не зарегистрировано с именем: 1"



Что я делаю не так ?
...
Рейтинг: 0 / 0
Autofac ResolveNamed но получить все зарегистрированные компоненты для интерфейса. Как ?
    #39148344
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotekРегистрировать на один интерфейс различные сервисы, без возможности их фильтровать перед созданием (через named, keyed) мне кажется бессмысленным.Ну всякие бывают случаи. Я бы не был столь категоричным. :-)
ProBiotekПричем
Код: c#
1.
2.
3.
            IEnumerable<ILogger> loggers = _сontainer.Resolve<IEnumerable<ILogger>>(); // возвращает пустой список

            var lll = _сontainer.ResolveNamed<ILogger>("1"); // выбрасывает исключение "не зарегистрировано с именем: 1"



Что я делаю не так ?Если что-то не получается, то нужно читать инструкию . :-)
Supported Relationship TypesA needs all the kinds of B

IEnumerable<B>, IList<B>, ICollection<B>

Enumeration
...
Рейтинг: 0 / 0
Autofac ResolveNamed но получить все зарегистрированные компоненты для интерфейса. Как ?
    #39148379
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот эта регистрация работает. нашел у себя ошибку. Регистрировал один интерфейс, а запрашивал другой - поэтому резолвинг по имени ничего и не возвращал. Это исправил.

Собственно теперь имею следующее:

Код: c#
1.
2.
3.
var lll = _сontainer.ResolveNamed<ILogger>("1");  // возвращает корректный результат
lll.Log(null);   // вызов проходит успешно. обрабатывается.
IEnumerable< ILogger >loggers=_сontainer.Resolve<IEnumerable< ILogger >>();// Возвращает пустой список (не null)



Вот это странно. Один контейнер. По имени резолвит все правильно. Но при запросе общего списка, ничего не возвращает.
...
Рейтинг: 0 / 0
Autofac ResolveNamed но получить все зарегистрированные компоненты для интерфейса. Как ?
    #39148387
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доп. Убрал регистрацию по имени, и заработал резолвинг списка по интерфейсу (Resolve<IEnumerable<IMyService>>).

Таким образом подозреваю, что при регистрации через именованные службы, не получится их потом перечислить.

Кто нибудь может это подтвердить у себя быстрым тестом ? Может я сильно ошибаюсь.
...
Рейтинг: 0 / 0
Autofac ResolveNamed но получить все зарегистрированные компоненты для интерфейса. Как ?
    #39148446
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Полный пример кода, если кто-то может помочь.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
public interface ISimpleService
{
    string Test();
}
public class SimpleService1 : ISimpleService
{
    public string Test()
    {
        return "Hello World from SimpleService1";
    }
}

internal class Program
{
    private static void Main(string[] args)
    {
        var builder = new ContainerBuilder();
        {
            builder.RegisterType<SimpleService1>().Named<ISimpleService>("fff");
        }

        IContainer container = builder.Build();

        var services = container.Resolve<IEnumerable<ISimpleService>>();

        Console.WriteLine(services.Count()); // 0. Why ?
    }
}
...
Рейтинг: 0 / 0
Autofac ResolveNamed но получить все зарегистрированные компоненты для интерфейса. Как ?
    #39149481
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рабочее решение, если кому пригодится:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
public interface ISimpleService
    {
        string Test();
    }
    public class SimpleService1 : ISimpleService
    {
        public string Test()
        {
            return "Hello World from SimpleService1";
        }
    }

    internal class Program
    {
        private static void Main(string[] args)
        {
            var builder = new ContainerBuilder();
            {
                builder.RegisterType<SimpleService1>().Named<ISimpleService>("fff").As<ISimpleService>();
            }

            IContainer container = builder.Build();

            var services = container.Resolve<IEnumerable<ISimpleService>>();

            Console.WriteLine(services.Count()); // 1.
        }
    }



использовать либо
Код: c#
1.
builder.RegisterType<SimpleService1>().Named<ISimpleService>("fff").As<ISimpleService>();


либо
Код: c#
1.
builder.RegisterType<SimpleService1>().Named<ISimpleService>("fff").AsImplementedInterfaces();
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Autofac ResolveNamed но получить все зарегистрированные компоненты для интерфейса. Как ?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]