powered by simpleCommunicator - 2.0.35     © 2025 Programmizd 02
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Di generic
10 сообщений из 60, страница 3 из 3
Di generic
    #40062927
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Зачем? Это просто сервис.

Тут вот такой ньюанс. Если ты его зарегаешь просто как класс:
Код: c#
1.
services.AddTransient<Handler1>();


то он тебе интерфейс не разрезолвит. Т.е. что-нибудь такого типа:
Код: c#
1.
_serviceProvider.GetService<IMessageHandler<Message1>>();


просто не сработает.

Т.е. чтобы сработало тебе его надо будет при регистрации разобрать по интерфейсам и зарегать каждый интерфейс отдельно. А для этого уже нужен кастомный метод регистрации, о чем я выше как раз и писал.
...
Рейтинг: 0 / 0
Di generic
    #40062928
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,

Так и не понял, зафига тебе хендлеры в медиаторе.

AddMediator здесь некорректный, коллекция services на момент вызова ещё не сформирована до конца.
...
Рейтинг: 0 / 0
Di generic
    #40062929
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt
Зачем? Это просто сервис.

Тут вот такой ньюанс. Если ты его зарегаешь просто как класс:
Код: c#
1.
services.AddTransient<Handler1>();



то он тебе интерфейс не разрезолвит. Т.е. что-нибудь такого типа:
Код: c#
1.
_serviceProvider.GetService<IMessageHandler<Message1>>();



просто не сработает.

Т.е. чтобы сработало тебе его надо будет при регистрации разобрать по интерфейсам и зарегать каждый интерфейс отдельно. А для этого уже нужен кастомный метод регистрации, о чем я выше как раз и писал.



Дык, это просто хелпер. Но зато тебе не нужно регать в двух местах, и вообще это очевидное решение.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
public static IServiceCollection AddHandlerTransient<THandler>(this IServiceCollection services)
   where THandler : IMessageHandler // маркер-интерфейс для тайп-чекинга
{
   var handlerInterfaces = typeof(THandler).GetInterfaces()
                .Where(itf => itf.IsGenericType && itf.GenericTypeDefinition() == typeof(IMessageHandler<>));
    foreach(var handlerInterface in handlerInterfaces)
    {
       services.AddTransient(handlerInterface, typeof(THandler));
    }
}


services.AddHandlerTransient<Handler1>();
services.AddHandlerTransient<Handler2>();



Как пример.
...
Рейтинг: 0 / 0
Di generic
    #40062930
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Код: c#
1.
AddHandlerTransient<THandler>


Ну вот. Я о том и говорил. А еще надо AddHandlerSingleton, AddHandlerScoped, и еще стопятьсот такого же учитывая все возможные перегрузки параметров.

Кстати, вот, подтверждение того, что схема с просто регистрацией не прокатит:
https://github.com/fkthat/MediatorLite/blob/feature/adv_reg/test/Test.FkThat.MediatorLite/Test_POC.cs
...
Рейтинг: 0 / 0
Di generic
    #40062961
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
fkthat,

Вот пример подобного решения:

https://github.com/dotnet/runtime/blob/main/src/libraries/Microsoft.Extensions.Hosting.Abstractions/src/ServiceCollectionHostedServiceExtensions.cs

Сервис фоновой службы регистрируется в DI, и больше нигде.

Типовой екстеншен для регистрации - все такие пишут, чего уж тут удивительного. Кстати, вообще про этот екстеншен не знал - всегда руками его просто регал.

Но тут я уже писал, что можно ведь сделать вообще с единственным кастомным екстеншеном: 22309630

fkthat
И тогда просто:
Код: c#
1.
2.
3.
services.AddTransient<Handler1>();
services.AddTransient<Handler2>();
services.AddMediator();


Т.е. никаких специальных екстеншенов для регистрации хендлеров тогда не надо - просто стандартно их регать и все. А медиатор по-любому регать надо, поэтому AddMediator() вместо AddTransient<IMediator>() никакого кода не добавляет.
...
Рейтинг: 0 / 0
Di generic
    #40062974
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat

Ну его и без ДИ использовали как-то там для всяких компонентов и т.п. - говорю же он с самого первого фреймворка существует.

Самый первый был 1,0
...
Рейтинг: 0 / 0
Di generic
    #40062988
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
handmadeFromRu,
А как изначально звучит задача?
Просто вижу попытку, используя абстракции языка, решить что то. Но абстракции языка тут пошли на конфликт с абстракциями библиотеки и группа товарищей (@hVostt , @fkthat) придумала новую абстракцию, дабы разрешить проблему конфликта абстракций используемых ранее....
...
Рейтинг: 0 / 0
Di generic
    #40063465
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВ,

да вроде первый пост описывает. ну давай больше опишу. у меня есть набор данных с приборов которые идут стримом из нетворка в каналы(что то типо тпл но на базе каналов, подумываю про фшарп и гопак).в бд имеется мапа как интерпретировать данные с приборов. типов может быть щас 3 поэтому я преобразую данные по мапе в конкретную сущность и вызываю конкретный процессор по типу сущности чтобы запроцесить сущность. вот собственно и все.
вкрации цепочка network => pipe=> write raw local storage=> read raw from storage => tranform raw to concret enity => process enitity
...
Рейтинг: 0 / 0
Di generic
    #40064313
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Ну вот. Я о том и говорил. А еще надо AddHandlerSingleton, AddHandlerScoped, и еще стопятьсот такого же учитывая все возможные перегрузки параметров.


Тот случай, когда хотели как проще, а получилось как всегда.
Мне поэтому интерфейс регистрации Autofac нравится, там это решается одним простым расширением для билдера, нисколько не теряя в гибкости.

В общем, меня бы остановил тот факт, что я вынужден одну и ту же фигню регать по два раза :)

Даже в полновесном MediatR всё просто: https://github.com/jbogard/MediatR/blob/master/samples/MediatR.Examples.AspNetCore/Program.cs

Т.е. можешь свои хендлеры зарегать как тебе душе угодно, медиатр их найдёт. И это красивое решение. Регать же заранее всё в медиаторе -- сильно упрощает реализацию самой библиотеки, но усложняет использование, и по сути читерство ))
...
Рейтинг: 0 / 0
Di generic
    #40064328
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
В общем, меня бы остановил тот факт, что я вынужден одну и ту же фигню регать по два раза :)

Ну так я уже сделал, что и по два раза не нужно, и порядок регистрации не важен.
https://github.com/fkthat/MediatorLite/blob/develop/src/FkThat.MediatorLite.DependencyInjection/ServiceCollectionExtensions.cs
...
Рейтинг: 0 / 0
10 сообщений из 60, страница 3 из 3
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Di generic
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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