powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / AspNet Core. Как заинжектить текущий контроллер в класс-сервис ?
25 сообщений из 177, страница 2 из 8
AspNet Core. Как заинжектить текущий контроллер в класс-сервис ?
    #39783280
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
AspNet Core. Как заинжектить текущий контроллер в класс-сервис ?
    #39783781
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCorePetro123,

ServiceResult, в моей интерпретации приведенной изначально, это некий прослоечный класс. Я думал сделать их кучу, а Shocker.Pro
предлагает просто объединить в один класс, но с кучей свойств, как я понимаю, собранных со всех классов типа NotFoundResult, OkResult. Затем возвращать их из сервиса в контроллер, где некий метод будет анализировать этот объект и, в зависимости от заполнения свойств, создавать уже реальные Result'ы.

Ну вот все это какое-то завуализованное и усложненное дублирование получается. Т.к. появится логика по парсингу ServiceResult с последующим созданием соответствующих result'ов. Уж лучше тогда как я предлагал, насоздавать MyNotFoundResult, MyOkResult и просто их преобразовывать в классы из Aspnet.


Мне не нравится это решение. Я лучше при своем останусь.Многие пользуются (различные широкоиспользуемые библиотеки), а ему видите-ли не нравится.

Ну не нравится - делай свой велосипед, отговаривать что-ли теперь? :)

А так-то всё просто:
Код: 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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
using System;
using Status = OperationStatus;

/// <summary>
/// Represents a generic type for any operation's result
/// </summary>
public class OperationResult<TValue>
{
    public OperationResult(Exception exception)
        : this(Status.InternalError)
    {
        this.Exception = exception;
    }

    public OperationResult(Status status, string message)
        : this(status)
    {
        this.Message = message;
    }

    public OperationResult(Status status, TValue value = default(TValue))
    {
        this.Status = status;
        this.Success = status == Status.Success;
        this.Value = value;
    }

    /// <summary>
    /// If Success is false and an exception has been caught internally, this field will contain the exception.
    /// </summary>
    public Exception Exception { get; private set; }

    /// <summary>
    /// Returns message if the operation was not successful.
    /// </summary>
    public string Message { get; private set; }

    /// <summary>
    /// The status for the operation.
    /// </summary>
    public Status Status { get; private set; }

    /// <summary>
    /// Returns true if the operation was successful.
    /// </summary>
    /// <remarks>If Success is false, use the Exception property to help determine the reason.</remarks>
    public bool Success { get; private set; }

    /// <summary>
    /// The result obtained during the operation.
    /// </summary>
    public TValue Value { get; private set; }
}


Код: 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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
/// <summary>
/// Represents a status of an operation
/// </summary>
public enum OperationStatus
{
    /// <summary>
    /// Indicates that the status has not been set.
    /// </summary>
    Undefined = 0,

    /// <summary>
    /// The operation was successful.
    /// </summary>
    Success,

    /// <summary>
    /// The requested resource does not exist.
    /// </summary>
    NotFound,

    /// <summary>
    /// The operation is not allowed.
    /// </summary>
    NotAllowed,

    /// <summary>
    /// The operation is not supported at the moment.
    /// </summary>
    NotSupported,

    /// <summary>
    /// The operation is not valid (for example it contains an inconsistent data).
    /// </summary>
    NotValid,

    /// <summary>
    /// An internal error has occured.
    /// </summary>
    InternalError
}


Это разве куча свойств?
...
Рейтинг: 0 / 0
AspNet Core. Как заинжектить текущий контроллер в класс-сервис ?
    #39783782
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Простейшая конвертация:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
private static ActionResult ToActionResult<TValue>(IOperationResult<TValue> source, Func<TValue, ActionResult> onSuccess)
{
    switch (source.Status)
    {
        case OperationStatus.InternalError:
            var exception = source.Exception;
            return exception == null
                ? new HttpStatusCodeResult(HttpStatusCode.InternalServerError)
                : new HttpStatusCodeResult(HttpStatusCode.InternalServerError, exception.Message);
        case OperationStatus.NotAllowed:
            return new HttpStatusCodeResult(HttpStatusCode.Forbidden, source.Message);
        case OperationStatus.NotSupported:
        case OperationStatus.NotValid:
            return new HttpStatusCodeResult(HttpStatusCode.MethodNotAllowed, source.Message);
        case OperationStatus.NotFound:
            return new HttpStatusCodeResult(HttpStatusCode.NotFound, source.Message);
        case OperationStatus.Success:
            return onSuccess(source.Value);
    }

    throw new NotImplementedException($"Conversion is not implemented for the following OperationStatus value: {source.Status}");
}
...
Рейтинг: 0 / 0
AspNet Core. Как заинжектить текущий контроллер в класс-сервис ?
    #39783786
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И метод контроллера превращается в две строки:
Код: c#
1.
2.
3.
4.
5.
6.
public async Task<ActionResult<MyResult>> GetData([FromBody] MyParameters parameters)
{
    var result = await _myService.GetDataAsync(parameters);
	   
    return ToActionResult(result, value => this.Json(value));
}
...
Рейтинг: 0 / 0
AspNet Core. Как заинжектить текущий контроллер в класс-сервис ?
    #39783805
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мух,

Масло масляное. В таком виде нет никаких причин не таскать через все слои asp.net-овские классы ActionResult, что уже наводит на определённые не весёлые мысли.
...
Рейтинг: 0 / 0
AspNet Core. Как заинжектить текущий контроллер в класс-сервис ?
    #39783806
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCoreВариант с Task<MyResult> я отбросил, т.к. такой формат не позволяет сервису возвращать различные статусы

В вашем выбранном подходе УЖЕ

WaspNewCoreНе красиво получается.

Отсюда любые попытки решить ЭТО выглядит как поиск наилучшего способа поедания гнилого фрукта -- факт прогнилости никакой способ не изменит.

Возвращать из внутренней логики статусы, которые нужны только для взаимодействия с клиентом по определённому протоколу, это уже шит, зашквар и... выбирайте абсолютно любой способ, так как всё равно получится фигня. Работать будет и ладно. Запушьте, залейте на прод и спите себе спокойно, одним г-кодом больше, какая разница :)
...
Рейтинг: 0 / 0
AspNet Core. Как заинжектить текущий контроллер в класс-сервис ?
    #39783819
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttДмитрий Мух,

Масло масляное. В таком виде нет никаких причин не таскать через все слои asp.net-овские классы ActionResult, что уже наводит на определённые не весёлые мысли.
Какие такие asp.net-овские классы? Это не попытка таскать ActionResult.

_myService же слой некой бизнес логики, где есть некие бизнес-операции, чаще всего успешные, но не всегда.
Это классы бизнес-логики, доменной модели.
Использоваться могут не только в asp.net.

Вообще давайте всё в контроллер запихнём, следуя твоим рассуждениям. В нём же уже есть метод GetData.
Зачем выделять какой-то сервис ещё с одним методом GetData? Масло масляное
...
Рейтинг: 0 / 0
AspNet Core. Как заинжектить текущий контроллер в класс-сервис ?
    #39783822
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати легко заметить, что
Код: c#
1.
private static ActionResult ToActionResult<TValue>(IOperationResult<TValue> source, Func<TValue, ActionResult> onSuccess)


просто оформляется как расширение
Код: c#
1.
internal static ActionResult ToActionResult<TValue>(this IOperationResult<TValue> source, Func<TValue, ActionResult> onSuccess)


Легко покрывается тестами. И мы получам простую чепочку вызовов.
Код: c#
1.
2.
3.
4.
public async Task<ActionResult<MyResult>> GetData([FromBody] MyParameters parameters)
{
    return await _myService.GetDataAsync(parameters).ToActionResult(this.Json);
}
...
Рейтинг: 0 / 0
AspNet Core. Как заинжектить текущий контроллер в класс-сервис ?
    #39783841
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне одному кажется, что в шарпе модно все топики сводить к волшебному Result или MyResult?
В прошлый раз 17 страниц обсуждали))).
Или без Result писать не умеем?
...
Рейтинг: 0 / 0
AspNet Core. Как заинжектить текущий контроллер в класс-сервис ?
    #39783856
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,

да, функциональный подход в C# всё больше входит в моду...
передаёшь параметры в метод и гарантированно получаешь результат определённого типа
ни null, ни исключение, а Result

чистые функции, читсый код без ветвлений и трай-кетчей, тестируемый, читабельный
...
Рейтинг: 0 / 0
AspNet Core. Как заинжектить текущий контроллер в класс-сервис ?
    #39783873
PinkCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мух,

передаёшь параметры в метод и гарантированно получаешь результат определённого типа
-----
Все гораздо хуже.
Наблюдается даже отход от ООП.

Я тут как-то оценил затраты на создание полной модели данных для производства вполне определенного продукта.
По результатам получилось около 2-х лет.
Потом выкинул нафиг все ООП и нарисовал за неделю нужный результат элементарно получая нужные данные по месту/времени.
Работало не эффективно, оптимизировать там разумеется ничего невозможно, но одна неделя вс два года...
...
Рейтинг: 0 / 0
AspNet Core. Как заинжектить текущий контроллер в класс-сервис ?
    #39783874
PinkCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
AspNet Core. Как заинжектить текущий контроллер в класс-сервис ?
    #39783875
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PinkCat,
+1
...
Рейтинг: 0 / 0
AspNet Core. Как заинжектить текущий контроллер в класс-сервис ?
    #39783897
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий МухКакие такие asp.net-овские классы? Это не попытка таскать ActionResult.

А что, по-твоему, такое ActionResult? Даже в названии видно, что это результат выполнения операции, который транслируется в ответ, это не сам ответ, в качестве которого выступает HttpResponseMessage.

И чем он отличается от OperationResult в той интерпретации, которую ты привёл?

Дмитрий Мух_myService же слой некой бизнес логики, где есть некие бизнес-операции, чаще всего успешные, но не всегда.
Это классы бизнес-логики, доменной модели.
Использоваться могут не только в asp.net.

Спору нет, но всё сильно зависит от операции, от логики.
Попытка свести все действия контроллеров в нечто подобное:

Код: c#
1.
2.
3.
4.
5.
public async Task<IActionResult> SomeAction(...)
{
    var result = await _someService.SomeOperationAsync(...);
    return result.ToActionResult();
}



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

Дмитрий МухВообще давайте всё в контроллер запихнём, следуя твоим рассуждениям. В нём же уже есть метод GetData.
Зачем выделять какой-то сервис ещё с одним методом GetData? Масло масляное


Нет. Контроллеры должны быть тупыми, на не настолько, чтобы быть в них совершенно не было смысла. У них есть смысл, и это явно не конвертирование OperationResult в ActionResult. Это совершенно безумная крайность. Что тут тестировать? Правильно ли конвертится одно в другое? Это вообще обыкновенный маппинг и решается на другом уровне, с тестированием и самоконтролем.
...
Рейтинг: 0 / 0
AspNet Core. Как заинжектить текущий контроллер в класс-сервис ?
    #39783898
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мухда, функциональный подход в C# всё больше входит в моду...
передаёшь параметры в метод и гарантированно получаешь результат определённого типа
ни null, ни исключение, а Result

чистые функции, читсый код без ветвлений и трай-кетчей, тестируемый, читабельный

ФП хорошо. Эффективные практики из ФП брать -- хорошо.

ФП головного мозга, как впрочем и остальное -- плохо.
...
Рейтинг: 0 / 0
AspNet Core. Как заинжектить текущий контроллер в класс-сервис ?
    #39783899
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий МухКстати легко заметить, что
Код: c#
1.
private static ActionResult ToActionResult<TValue>(IOperationResult<TValue> source, Func<TValue, ActionResult> onSuccess)



просто оформляется как расширение
Код: c#
1.
internal static ActionResult ToActionResult<TValue>(this IOperationResult<TValue> source, Func<TValue, ActionResult> onSuccess)



Легко покрывается тестами. И мы получам простую чепочку вызовов.
Код: c#
1.
2.
3.
4.
public async Task<ActionResult<MyResult>> GetData([FromBody] MyParameters parameters)
{
    return await _myService.GetDataAsync(parameters).ToActionResult(this.Json);
}



Я хз что тут покрывать. Маппинг? Если весь код такой, то в контроллерах вообще нет смысла, это обыкновенный оверхед. Функции контроллера перенесены в сервисы. Сервисы стали деревянными, и заточенными чисто под общение через конкретный протокол.

Что касается "не зависит от...", ещё как зависит. Похоже всё идёт по очередному кругу и мы получаем очередную реинкарнацию RPC.

Плохого в этом ничего нет, но наблюдается большой оверхед на то, что это впихивается в Web API. Хотя он уже нафиг тут не нужен, пишем декларативную обвязку в собсвтенном middleware.

От OperationResult отпочковываем всякие CacheableOperationResult и т.д. и т.п.
...
Рейтинг: 0 / 0
AspNet Core. Как заинжектить текущий контроллер в класс-сервис ?
    #39783904
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PinkCatДмитрий Мух,

передаёшь параметры в метод и гарантированно получаешь результат определённого типа
-----
Все гораздо хуже.
Наблюдается даже отход от ООП.
Где и в какую сторону? Поясните?
...
Рейтинг: 0 / 0
AspNet Core. Как заинжектить текущий контроллер в класс-сервис ?
    #39783905
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttДмитрий МухКстати легко заметить, что
Код: c#
1.
private static ActionResult ToActionResult<TValue>(IOperationResult<TValue> source, Func<TValue, ActionResult> onSuccess)




просто оформляется как расширение
Код: c#
1.
internal static ActionResult ToActionResult<TValue>(this IOperationResult<TValue> source, Func<TValue, ActionResult> onSuccess)




Легко покрывается тестами. И мы получам простую чепочку вызовов.
Код: c#
1.
2.
3.
4.
public async Task<ActionResult<MyResult>> GetData([FromBody] MyParameters parameters)
{
    return await _myService.GetDataAsync(parameters).ToActionResult(this.Json);
}




Я хз что тут покрывать. Маппинг? Если весь код такой, то в контроллерах вообще нет смысла, это обыкновенный оверхед. Функции контроллера перенесены в сервисы. Сервисы стали деревянными, и заточенными чисто под общение через конкретный протокол.

Что касается "не зависит от...", ещё как зависит. Похоже всё идёт по очередному кругу и мы получаем очередную реинкарнацию RPC.

Плохого в этом ничего нет, но наблюдается большой оверхед на то, что это впихивается в Web API. Хотя он уже нафиг тут не нужен, пишем декларативную обвязку в собсвтенном middleware.

От OperationResult отпочковываем всякие CacheableOperationResult и т.д. и т.п.
Нет, всё совершенно не так. Никакие функции контроллера не перенесены в сервисы, о слова совсем.
...
Рейтинг: 0 / 0
AspNet Core. Как заинжектить текущий контроллер в класс-сервис ?
    #39783907
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На мой взгляд намечается очередной бессмысленный и беспощадный спор.

Хотелось бы увидеть какие-то конкретные и конструктивные примеры.
Какие именно функции контроллера перенесены в сервис? В чём конкретно отход от ООП?
...
Рейтинг: 0 / 0
AspNet Core. Как заинжектить текущий контроллер в класс-сервис ?
    #39783908
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий МухНет, всё совершенно не так. Никакие функции контроллера не перенесены в сервисы, о слова совсем.

Именно так это и выглядит. Если действие контроллера === действие сервиса, которое мапится из OperationResult в ActionResult, это действительно так. Совершенно так. По всем понятиям.

Ибо если, тебе вдруг в контроллере надо будет вызвать несколько действий сервисов (т.е. это уже означает, что у контроллеров есть логика АПИ), то уже ToActionResult тут не обойдёшься, так как тебе нужно каскадно проверить все результаты.
...
Рейтинг: 0 / 0
AspNet Core. Как заинжектить текущий контроллер в класс-сервис ?
    #39783909
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий МухНа мой взгляд намечается очередной бессмысленный и беспощадный спор.

Хотелось бы увидеть какие-то конкретные и конструктивные примеры.
Какие именно функции контроллера перенесены в сервис? В чём конкретно отход от ООП?

Хз насчёт ООП, я об этом не заикался. Я говорю о конкретных приведённых примерах.
В частности о волшебном расширении ToActionResult. Нет, это не выглядит "круто, удобно, тестируемо,бла-бла-бла". Это выглядит глупо.
...
Рейтинг: 0 / 0
AspNet Core. Как заинжектить текущий контроллер в класс-сервис ?
    #39783910
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий МухНа мой взгляд намечается очередной бессмысленный и беспощадный спор.

Спор не о том, хорошо или плохо OperationResult.
...
Рейтинг: 0 / 0
AspNet Core. Как заинжектить текущий контроллер в класс-сервис ?
    #39783915
PinkCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мух,

Где и в какую сторону?
-----
В сторону процедурной парадигмы.
По профилю - работа с разными базами как источниками информации.
...
Рейтинг: 0 / 0
AspNet Core. Как заинжектить текущий контроллер в класс-сервис ?
    #39783923
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttДмитрий МухНет, всё совершенно не так. Никакие функции контроллера не перенесены в сервисы, о слова совсем.

Именно так это и выглядит. Если действие контроллера === действие сервиса, которое мапится из OperationResult в ActionResult, это действительно так. Совершенно так. По всем понятиям.
Действие сервиса было и осталось дейтсвием сервиса, просто результат этого действия не тупо TValue, а OperationResult<TValue>.

У тебя есть метод сервис
Код: c#
1.
TResult DoSomething()


и
Код: c#
1.
Task<TResult> DoSomethingAsync()


Внезапно последний перестал быть действием сервиса?
...
Рейтинг: 0 / 0
AspNet Core. Как заинжектить текущий контроллер в класс-сервис ?
    #39783926
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PinkCatДмитрий Мух,

Где и в какую сторону?
-----
В сторону процедурной парадигмы.
По профилю - работа с разными базами как источниками информации.
А, это вы про что-то своё. Вы хоть процитируйте пост, к которому относятся ваши выводы.

Возврат не пермитивного типа, или TValue из метода DoSomething, OperationResult<TValue> тут при чём?
...
Рейтинг: 0 / 0
25 сообщений из 177, страница 2 из 8
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / AspNet Core. Как заинжектить текущий контроллер в класс-сервис ?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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