Пользовательские классы в ASP.Net Core

Новичок в .NET Core. Я пытаюсь создать собственный класс, который можно вызывать из разных контроллеров.

В корне своего проекта я создал папку Helpers. В этом я создал EncryptString.cs:

namespace VPV.Helpers {
    public class EncryptString {
        public string Index(string val, string salt) {
            byte[] data = Encoding.UTF8.GetBytes(val + salt);
            data = SHA512.Create().ComputeHash(data);
            return Convert.ToBase64String(data);
        }
    }
}

Но как мне вызвать это с моего контроллера?

Я пробовал что-то вроде:

public async Task<IActionResult> OnPostAsync(Guid id, string password, string passwordCheck) {
    hashedPassword = new VPV.Helpers.EncryptString [...]
}

Но я застрял в этом.

Я думаю, вы, вероятно, хотели, чтобы это был статический вызов. Однако лучшим подходом было бы сделать этот помощник инъекционным сервисом, но не уверен, что вы сочтете это слишком продвинутым или излишним. Я только предложил это, поскольку вы указали, что он будет использоваться несколькими контроллерами.

Nkosi 11.12.2018 10:22

Учитывая наименования OnPostAsync. это проект razor Pages?

Nkosi 11.12.2018 10:24

Я хотел бы, чтобы это было как можно проще. Можно ли продолжить так, как я начал? ИМО, это не может быть намного проще, чем вызвать «новый VPV.Helpers.EncryptString» с контроллеров, где мне это нужно? Да, это Razor Pages.

Mads 11.12.2018 10:37

Хорошо, тогда, хотя это не самый лучший дизайн, сделайте метод статическим и вызовите его там, где это необходимо.

Nkosi 11.12.2018 10:40
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
971
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, вы, вероятно, хотели, чтобы это был статический вызов. Однако лучшим подходом было бы сделать этот помощник инъекционным сервисом, но не уверен, что вы сочтете это слишком продвинутым или излишним.

Я только предложил это, поскольку вы указали, что он будет использоваться несколькими контроллерами.

Теперь, когда вы упомянули, что хотите сделать его простым и, хотя это не лучший дизайн, сделать метод статическим,

namespace VPV.Helpers {    
    public static class Strings {    
        public string Encrypt(string val, string salt) {
            byte[] data = Encoding.UTF8.GetBytes(val + salt);
            data = SHA512.Create().ComputeHash(data);
            return Convert.ToBase64String(data);
        }
    }
}

и звоните где нужно.

public async Task<IActionResult> OnPostAsync(Guid id, string password, string passwordCheck) {
    //...

    var hashedPassword = new VPV.Helpers.Strings.Encrypt(password, salt);

    //...
}

Вы также можете рассмотреть возможность преобразования помощника в метод расширения

namespace VPV.Helpers {    
    public static class Strings {    
        public string Encrypt(this string val, string salt) {
            byte[] data = Encoding.UTF8.GetBytes(val + salt);
            data = SHA512.Create().ComputeHash(data);
            return Convert.ToBase64String(data);
        }
    }
}

что тогда означало бы, что вы можете назвать это как

public async Task<IActionResult> OnPostAsync(Guid id, string password, string passwordCheck) {
    //...

    var hashedPassword = password.Encrypt(salt);

    //...
}

Инъекционные службы - это правильный выбор - не потому, что это хороший подход, а потому, что именно так построено ядро ​​ASP.Net для работы. Если вы сделаете это по-другому, вы будете постоянно с этим бороться.

gbjbaanb 11.12.2018 10:48

Большое тебе спасибо! Одно лучше другого?

Mads 11.12.2018 10:49

@Mads они в основном такие же. В конце концов, это будет зависеть от ваших предпочтений.

Nkosi 11.12.2018 10:51

@Mads, сделав его методом расширения, вы можете использовать любой из предложенных синтаксических вызовов.

Nkosi 11.12.2018 10:51

@gbjbaanb борется с этим как? Чтение инъекции docs.microsoft.com/en-us/aspnet/core/fundamentals/… тоже кажется довольно простым, но что я получу?

Mads 11.12.2018 10:57

@Mads, это не имеет значения, если вы попытаетесь использовать «нормальные» классы, вы окажетесь в мире, где было бы проще сделать их служебными классами, поскольку это то, чего хочет и ожидает фреймворк. Статические классы работают, но только если они простые, иначе вы будете передавать объекты в методах по мере их создания фреймворком.

gbjbaanb 11.12.2018 20:42

Другие вопросы по теме