(я уверен, что я отформатировал вопрос плохо, я был бы рад пересмотреть и исправить в зависимости от комментариев)Как преобразовать этот метод статического класса в инъекцию зависимостей? (Специальный код включен)
У меня есть статический класс, и я пытаюсь улучшить дизайн внедрение зависимости. Я не обязательно хочу, чтобы этот класс стал статическим, потому что я буду использовать .NET Core, который продвигает инъекцию зависимостей над ситуациями статического класса.
Упрощенный код в .NET (не основной):
public static class Utils
{
public static readonly string tokenUrl = ConfigurationManager.AppSettings["tokenUrl"];
public static readonly string tokenKey = ConfigurationManager.AppSettings["tokenKey"];
public async static Task<bool> SendEmail(Email email)
{
var http = new HttpClient();
http.DefaultRequestHeaders.Add("subscription-key", tokenKey);
try
{
await http.PostAsync(tokenUrl + "email", new StringContent(JsonConvert.SerializeObject(email), Encoding.UTF8, "application/json"));
}
catch (Exception e)
{
return false;
}
return true;
}
}
Для ConfigurationManager.AppSettings (он не существует в .NET Ядра), я планирую использовать метод в этой ссылке: http://www.danylkoweb.com/Blog/no-configurationmanager-in-aspnet-core-GC
Однако, для преобразования этого метода (SendMail) в инъекцию зависимостей, я совершенно потерян. Я прочитал много примеров и статей, и я понимаю логику инъекции зависимостей, но я не знаю, как преобразовать этот статический класс в правильную инъекцию зависимостей. Существуют другие методы в том же классе Utils, но это самый простой, и я надеюсь найти других, используя этот.
Подход, который я думал, был выключен:
public interface ISendMail
{
FormSettings ConfigSettings { get; set; }
Task<bool> SendEmail(IOptions<FormSettings> settings, Email email);
}
и:
public class SendEmail : ISendMail
{
public async static Task<bool> SendEmail(IOptions<FormSettings> settings, Email email)
{
//do same things
}
}
но я ЯСНО потерял с этим, потому что он даже не имеет смысла. Другой подход, который я думал был:
public class SendEmail
{
FormSettings ConfigSettings { get; set; }
protected Email email = null;
public SendEmail(IOptions<FormSettings> settings, Email email)
{
ConfigSettings = settings.Value;
this.email = email;
}
public async static Task<bool> SendEmailAction()
{
//do same things with "email" and "ConfigSettings"
}
}
Я знаю, что я даю много кода здесь, и я не был уверен, что я должен спросить об этом в «Code Review» или что-то. Моя самая большая проблема - неFormSettings часть, но реализующая функциональность SendEmail в формате инъекции зависимостей.
Вскоре, как я могу преобразовать этот класс «SendEmail» в формат, где я могу использовать его с .NET Core без статического класса? Этот конкретный метод не требует изменений в .NET Core, но мои другие методы, поэтому я пытаюсь избавиться от подхода статического класса.
Я могу исключить части tokenUrl и tokenKey и упростить проблему, если это требуется, я просто совершенно потерял, как подойти к этой ситуации.
Я хотел бы упомянуть, что я не уверен, что я думал о том, чтобы включить функциональность в конструктор в первом испытании внедрения инъекций зависимостей, включая интерфейс, но я все равно оставлю это в вопросе, чтобы подчеркнуть, насколько потерян я в настоящее время , –
подумайте об этом с единицы измерения. Как вы могли бы назвать SendEmailAction? Поскольку это по-прежнему статический метод, вам будет сложно называть его, используя макетный экземпляр ISendMail. Если вы создадите единичный тест с макетом для ISendMail, я думаю, что он разъяснит, насколько полезен инъекция зависимостей. – Rake36