powered by simpleCommunicator - 2.0.35     © 2025 Programmizd 02
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Di generic
25 сообщений из 60, страница 1 из 3
Di generic
    #40061066
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что то подтупливаю уже или может ошибся. вообщем прошу консультации.
есть интрефейс
Код: c#
1.
2.
3.
4.
5.
6.
7.
interface BaseDto{}
class FirstDto:BaseDto{}
class SecondDto:BaseDto{}
interface IProcessor<T>
{
Task ProcessAsync(T model);
}


есть парочка реализаций
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
class FirstProcessor : IProcessor<FirstDto>
{
async Task ProcessAsync(FirstDto model)
}
class SecondProcessor : IProcessor<SecondDto>
{
async Task ProcessAsync(SecondDto model)
}


регаю как бы просто
Код: c#
1.
2.
services.AddTransient<IProcessor<FirstDto>, FirstProcessor >();
services.AddTransient<IProcessor<SecondDto>, SecondProcessor >();


но мне не нравиться использование по месту так как мне приходиться делать такое
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
class TargertClasss{
IProcessor<FirstDto> _f;
IProcessor<SecondDto> _s;
TargertClasss(IProcessor<FirstDto> f, IProcessor<SecondDto> s)
_f=f;
_s=s;
}

Task SomeAction(BaseDto){
switch (dto)
{
case FirstDto fdto: return _f.ProcessAsync(fdto);
case SecondDto sdto: return _s.ProcessAsync(sdto);
...
}
}


можно ли как то по типу объект его процессор через Di красиво процесить. или какие варики есть чтоб не писать явный свитч и n инъекций в конструкторе
...
Рейтинг: 0 / 0
Di generic
    #40061081
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Без отступов глаза ломаются вообще.
...
Рейтинг: 0 / 0
Di generic
    #40061192
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
handmadeFromRu
можно ли как то по типу объект его процессор через Di красиво процесить. или какие варики есть чтоб не писать явный свитч и n инъекций в конструкторе



Сделай фэктори:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
interface IProccesorFactory
{
   IProcessor<T> GetProcessor<T>();

   Task ProcessAsync<T>(T t);
}

class ProcessorFactory : IProccesorFactory
{
   IServiceProvider _sp;

   ProcessorFactory(IServiceProvider sp) => _sp = sp;

   IProcessor<T> GetProcessor<T>() => _sp.GetRequiredService<IProcessor<T>>();

   Task ProcessAsync<T>(T t) => GetProcessor<T>().ProcessAsync(t);
 
}
...
Рейтинг: 0 / 0
Di generic
    #40061193
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
handmadeFromRu,

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

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
...

    Task ProcessAsync<T>(T dto) where T: BaseDto
    {
       // получаем generic-определение типа
       var processorDefinition = typeof(IProcessor<>);
       // создаём конкретный тип процессора с параметром типа <T>
       var processorType = processorDefinition.MakeGenericType(dto.GetType());
       // получаем из DI экземпляр процессора
       var processor = _serviceProvider.GetRequiredService(processorType);
       // лайфхах, получаем генерик определение метода-обёртки для вызова метода процессора
       var genericMethodInfo = this.GetType().GetMethod(nameof(this.ProcessInternalAsync), BindingFlags.Instance | BindingFlags.NonPublic);
       // определение метода с параметром <T>
       var methodInfo = methodInfo.MakeGenericMethod(aggregateType, typeof(TCommand)); 
       // вызываем наш процессор
       return methodInfo.Invoke(null, processor);      
    }

    static Task ProcessInternalAsync<T>(IProcessor<T> processor) => processor.ProcessAsync();

...



ну вот как-то так
по-хорошему можно закешировать полученные типы, но и так сойдёт
...
Рейтинг: 0 / 0
Di generic
    #40061236
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt благодарю. попробую. с факторой блин я тупо не подумал что могу ж IServiceProvider засунуть
и оттуда разрулить все..и ведь просто.
а начал в стиле думать как бы типо фитчи в dryioc <key,inservcie<>> подтащить
...
Рейтинг: 0 / 0
Di generic
    #40061245
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
handmadeFromRu
а начал в стиле думать как бы типо фитчи в dryioc <key,inservcie<>> подтащить


Да ну.. такое себе решение, громоздкое и непрозрачное. Но зато не надо писать новых типов.
...
Рейтинг: 0 / 0
Di generic
    #40061251
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt да рефлекшн мой варик.. факторка тоже не зашла...у меня в channel объекты разнородные но от общего родителя и под каждого свой процессор т.е. динамически. спасибо буду раскуривать рефлекшен тут слабоват просто
...
Рейтинг: 0 / 0
Di generic
    #40061431
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты только не смейся, но почему бы, как готовое решение, не посмотреть MediatR
...
Рейтинг: 0 / 0
Di generic
    #40061449
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,

Технически можно медиатР. Но это архитектурное решение, его польза раскрывается, когда либа является частью архитектуры приложения. Опять же, есть и плюсы, есть и минусы — как говорится, не все так однозначно.
...
Рейтинг: 0 / 0
Di generic
    #40061474
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Ты только не смейся, но почему бы, как готовое решение, не посмотреть MediatR

я думал о медиатор но подумал ради 1 места целую библу чет борща
...
Рейтинг: 0 / 0
Di generic
    #40061485
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
handmadeFromRu
fkthat
Ты только не смейся, но почему бы, как готовое решение, не посмотреть MediatR

я думал о медиатор но подумал ради 1 места целую библу чет борща

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


Дык медиатр тоже в исходниках, берёшь и без зазрения совести тыришь че надо себе в проект
...
Рейтинг: 0 / 0
Di generic
    #40062549
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
поробуйте такую фитчу - регистратор
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
class RegisterType
    {
        private static readonly Dictionary<Type ,Action<object>> Dictionary = new Dictionary<Type, Action<object>>();
        public static void Add<T>(Action<T> action) where T : class
        {
           Dictionary.Add(typeof(T),(Action<object>) action);
        }

        public static void Invoke<T>(T t)  where T:BaseDto
        {
            Dictionary[typeof(T)].Invoke(t);
        }
    }


целевой бы конструктор выглядел так
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 TargertClasss(IProcessor<FirstDto> f, IProcessor<SecondDto> s)
        {
            RegisterType.Add<FirstDto>((a) =>
            {
                f.ProcessAsync(a);
            });
            RegisterType.Add<SecondDto>((a) =>
            {
                s.ProcessAsync(a);
            });
        }


ну и сам вызов
Код: c#
1.
2.
3.
4.
void SomeAction(BaseDto dto)
        {
            RegisterType.Invoke(dto);
        }


ну может типы дженериков поплывут, я ведь в слепую, ну принцип думаю ясен.
...
Рейтинг: 0 / 0
Di generic
    #40062563
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
handmadeFromRu,

Я тут на гитхаб творчество выложил, можешь вот здесь посмотреть как сделано: https://github.com/fkthat/MediatorLite
...
Рейтинг: 0 / 0
Di generic
    #40062624
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,

а нафига

Task HandleMessageAsync(object message); ?

привет из прошлого )

хендлеры надо регать через какой-то конфигуратор -- не тру, олд вей, не флексибел
хендлеры железно синглтоны (

диспетчер строится на экспрешонах -- хорошо
это дело не кешируется -- плохо, вся прелесть слита в утиль

и де тесты, Билли ))
...
Рейтинг: 0 / 0
Di generic
    #40062631
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
а нафига
Task HandleMessageAsync(object message); ?
привет из прошлого )

Что-то вот это вообще не понял.

hVostt
хендлеры надо регать через какой-то конфигуратор -- не тру, олд вей, не флексибел
хендлеры железно синглтоны (

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

hVostt
диспетчер строится на экспрешонах -- хорошо
это дело не кешируется -- плохо, вся прелесть слита в утиль

Кешируется. Смотри внимательней. Там все експрешены строятся в статическом конструкторе ровно один раз.

hVostt
и де тесты, Билли ))

Ты смотрел хоть? Там 100% покрытия.
...
Рейтинг: 0 / 0
Di generic
    #40062637
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

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

Ты знаешь, я сейчас подумал, что можно эту схему с разруливанием от object к типизированному перенести в сам медиатор и тогда от нетепизированных обработчиков вообще избавиться. Надо будет вечерком сделать :)
...
Рейтинг: 0 / 0
Di generic
    #40062870
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,
оо поизучаю сорсы для развития
...
Рейтинг: 0 / 0
Di generic
    #40062873
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt
а нафига
Task HandleMessageAsync(object message); ?
привет из прошлого )

Что-то вот это вообще не понял.


Ну ты требуешь реализовать два метода у хендлера, один от T, другой принимает Object.


fkthat
hVostt
хендлеры надо регать через какой-то конфигуратор -- не тру, олд вей, не флексибел
хендлеры железно синглтоны (

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


Да, точно, увидел. Но ты требуешь регать хендлер в двух местах. В DI, потом через конфигуратор.
Зачем? Если хендлер есть в DI, этого должно быть достаточно. без сканирования сборок и регистрации через конфигуратор -- совершенно лишний шаг.

fkthat
Кешируется. Смотри внимательней. Там все експрешены строятся в статическом конструкторе ровно один раз.


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


fkthat
Ты смотрел хоть? Там 100% покрытия.


посыпаю голову пеплом...
...
Рейтинг: 0 / 0
Di generic
    #40062874
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
и тогда от нетепизированных обработчиков вообще избавиться


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

Кстати думал о том, будет ли твой медиатор работать в скоупе (например контроллеры), и без скоупа (например, в фоновых сервисах, IHostedService)?
...
Рейтинг: 0 / 0
Di generic
    #40062879
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
fkthat,

Кстати думал о том, будет ли твой медиатор работать в скоупе (например контроллеры), и без скоупа (например, в фоновых сервисах, IHostedService)?

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

Кстати думал о том, будет ли твой медиатор работать в скоупе (например контроллеры), и без скоупа (например, в фоновых сервисах, IHostedService)?

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


Да, у тебя медиатор transient..
...
Рейтинг: 0 / 0
25 сообщений из 60, страница 1 из 3
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Di generic
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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