Помогите пожалуйста разобраться в Dependency Injection ASP.NET Core

Рейтинг: 0Ответов: 0Опубликовано: 19.06.2023

У меня есть маленький проект где в коге есть зависимости которые надо убрать и добавить 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 и хочу научиться всё писать правильно. Что мне делать дальше? Что писать? Что изменить и исправить?

Ответы

Ответов пока нет.