Новичок в .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 [...]
}
Но я застрял в этом.
Учитывая наименования OnPostAsync. это проект razor Pages?
Я хотел бы, чтобы это было как можно проще. Можно ли продолжить так, как я начал? ИМО, это не может быть намного проще, чем вызвать «новый VPV.Helpers.EncryptString» с контроллеров, где мне это нужно? Да, это Razor Pages.
Хорошо, тогда, хотя это не самый лучший дизайн, сделайте метод статическим и вызовите его там, где это необходимо.





Я думаю, вы, вероятно, хотели, чтобы это был статический вызов. Однако лучшим подходом было бы сделать этот помощник инъекционным сервисом, но не уверен, что вы сочтете это слишком продвинутым или излишним.
Я только предложил это, поскольку вы указали, что он будет использоваться несколькими контроллерами.
Теперь, когда вы упомянули, что хотите сделать его простым и, хотя это не лучший дизайн, сделать метод статическим,
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 для работы. Если вы сделаете это по-другому, вы будете постоянно с этим бороться.
Большое тебе спасибо! Одно лучше другого?
@Mads они в основном такие же. В конце концов, это будет зависеть от ваших предпочтений.
@Mads, сделав его методом расширения, вы можете использовать любой из предложенных синтаксических вызовов.
@gbjbaanb борется с этим как? Чтение инъекции docs.microsoft.com/en-us/aspnet/core/fundamentals/… тоже кажется довольно простым, но что я получу?
@Mads, это не имеет значения, если вы попытаетесь использовать «нормальные» классы, вы окажетесь в мире, где было бы проще сделать их служебными классами, поскольку это то, чего хочет и ожидает фреймворк. Статические классы работают, но только если они простые, иначе вы будете передавать объекты в методах по мере их создания фреймворком.
Я думаю, вы, вероятно, хотели, чтобы это был статический вызов. Однако лучшим подходом было бы сделать этот помощник инъекционным сервисом, но не уверен, что вы сочтете это слишком продвинутым или излишним. Я только предложил это, поскольку вы указали, что он будет использоваться несколькими контроллерами.