Помогите пожалуйста разобраться в Dependency Injection ASP.NET Core
У меня есть маленький проект где в коге есть зависимости которые надо убрать и добавить DI. Я впервые занимаюсь ASP.NET и тема DI мне даётся пока с трудом поэтому прошу помощи, я хочу понять как правильно писать DI
Вот весь код разделённый на несколько файлов cs Это HomeControllers в папке Controllers
using Microsoft.AspNetCore.Mvc;
using SampleAppPractice.Models;
namespace SampleAppPractice.Controllers
{
public class HomeController : Controller
{
public IActionResult Index()
{
return View();
}
[HttpPost]
public IActionResult Index(string message)
{
var messageFactory = new MessageFactory();
var settings = new SmtpSettings()
{
Host = "smtp.example.com",
Port = 25
};
var smtpClient = new SmtpClient(settings);
var messanger = new Messanger(smtpClient,
messageFactory);
messanger.SendMessage(message, "admin@example.com");
return View();
}
}
}
Это уже 4 файла cs в папке Models
namespace SampleAppPractice.Models
{
public class MessageFactory
{
internal SmtpMessage Create(string message)
{
return new SmtpMessage() { Body = message };
}
}
}
namespace SampleAppPractice.Models
{
public class Messanger
{
private readonly SmtpClient _client;
private readonly MessageFactory _factory;
public Messanger(SmtpClient client, MessageFactory factory)
{
_client = client;
_factory = factory;
}
public void SendMessage(string message, string user)
{
SmtpMessage smtpMessage = _factory.Create(message);
_client.Send(smtpMessage);
}
}
}
using System.Diagnostics;
namespace SampleAppPractice.Models
}
public class SmtpClient
{
private readonly SmtpSettings _settings;
public SmtpClient(SmtpSettings settings)
{
_settings = settings;
}
internal void Send(SmtpMessage smtpMessage)
{
Debug.WriteLine("Message sent by SmtpClient.");
}
}
public class SmtpMessage
{
public string Body { get; internal set; }
}
}
namespace SampleAppPractice.Models
{
public class SmtpSettings
{
public int Port { get; set; }
public string Host { get; set; }
}
}
Ну а это просто Program.cs где происходит регистрация сервисов
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews();
var app = builder.Build();
app.MapDefaultControllerRoute();
app.Run();
Мне дали задание убрать зависимости и добавить DI Где и как вообще выглядит зависимость я не понял на уроках. Какие именно строки означают зависимость? И как правильно сделать Dependency Injection здесь?
Изменения:
HomeController
namespace SampleAppPractice.Controllers
{
public class HomeController : Controller
{
private readonly IMessageFactoryService
_messageFactoryService;
private readonly ISmtpClientService _smtpClientService;
private readonly ISmtpSettingsService _smtpSettingsService;
public HomeController(IMessageFactoryService
messageFactoryService, ISmtpClientService smtpClientService,
ISmtpSettingsService smtpSettingsService)
{
_messageFactoryService = messageFactoryService;
_smtpClientService = smtpClientService;
_smtpSettingsService = smtpSettingsService;
}
//public IActionResult Index()
//{
// return View();
//}
[HttpPost]
public IActionResult Index(string message)
{
//var messageFactory = new MessageFactory();
//var settings = new SmtpSettings()
//{
// Host = "smtp.example.com",
// Port = 25
//};
//var smtpClient = new SmtpClient(settings);
//var messanger = new Messanger(smtpClient,
messageFactory);
//messanger.SendMessage(message, "admin@example.com");
_smtpSettingsService.Host = "smtp.example.com";
_smtpSettingsService.Port = 25;
var messanger = new Messanger(_smtpClientService,
_messageFactoryService);
messanger.SendMessage(message, "admin@example.com");
return View();
}
}
}
MessageFactory, Messanger, SmtpClient, SmtpSettings
namespace SampleAppPractice.Models
{
public class MessageFactory : IMessageFactoryService
{
public SmtpMessage Create(string message)
{
return new SmtpMessage() { Body = message };
}
}
}
namespace SampleAppPractice.Models
{
public class Messanger
{
private readonly ISmtpClientService _client;
private readonly IMessageFactoryService _factory;
public Messanger(ISmtpClientService client,
IMessageFactoryService factory)
{
_client = client;
_factory = factory;
}
public void SendMessage(string message, string user)
{
SmtpMessage smtpMessage = _factory.Create(message);
_client.Send(smtpMessage);
}
}
}
namespace SampleAppPractice.Models
{
public class SmtpClient : ISmtpClientService
{
private readonly SmtpSettings _settings;
public SmtpClient(SmtpSettings settings)
{
_settings = settings;
}
public void Send(SmtpMessage smtpMessage)
{
Debug.WriteLine("Message sent by SmtpClient.");
}
}
public class SmtpMessage
{
public string Body { get; internal set; }
}
}
namespace SampleAppPractice.Models
{
public class SmtpSettings : ISmtpSettingsService
{
public int Port { get; set; }
public string Host { get; set; }
}
}
И папка Services которую я добавил и добавил в него 3 интерфейса
namespace SampleAppPractice.Services
{
public interface IMessageFactoryService
{
SmtpMessage Create(string message);
}
}
namespace SampleAppPractice.Services
{
public interface ISmtpClientService
{
void Send(SmtpMessage smtpMessage);
}
}
namespace SampleAppPractice.Services
{
public interface ISmtpSettingsService
{
public int Port { get; set; }
public string Host { get; set; }
}
}
Ну и зарегистрировал всё в builder.Services в классе Program
using SampleAppPractice.Models;
using SampleAppPractice.Services;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews();
var app = builder.Build();
builder.Services.AddSingleton<IMessageFactoryService, MessageFactory>();
builder.Services.AddSingleton<ISmtpClientService, SmtpClient>();
builder.Services.AddSingleton<ISmtpSettingsService, SmtpSettings>();
app.MapDefaultControllerRoute();
app.Run();
Укажите пожалуйста где я ошибся, что я добавил не правильно или где что я забыл. Повторяюсь, я впервые делаю проект с ASP.NET и хочу научиться всё писать правильно. Что мне делать дальше? Что писать? Что изменить и исправить?