Správné použítí DI   otázka

C#

Ahoj, dělám si aplikace v .net mvc a mám jeden problém. Ve svém projektu mám následující kód:

public partial class LogService : ILogService
{
    private readonly DBContext _con = new DBContext();

    public void LogNew(Log log)
    {
        _con.Logs.Add(log);
        _con.SaveChanges();
    }
}

public partial interface ILogService
{
    void LogNew(Log log);
}

Tuto službu použiji v následujícím kódu:

public class DBLogger
    {
        private static readonly ILogService _logService = new LogService();

        public override void Write(string name, string description,)
        {
            var log = new Log()
            {
                                Name = name,
                Description = description
            };
            _logService.LogNew(log);
        }
    }
}

Službu mám samozřejmě registrovanou. Následující třídu chci použít v jiné třídě. Nyní to funguje bez problémů, ale mám pocit, že tady nepoužívám DI že?A pokud bych to použil jak se má což znamená vytvořit následující kód:

private readonly ILogService _logService;

 public DBLogger(ILogService logService)
 {
     _logService = logService;
 }

Tady je problém, že nevím jak vytvořit objekt té třídy DBLogger. Samozřejmě můžu new DbLogger(new LogService). Předem všem strašně moc děkuji za pomoc. :)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

DI = Dependency Injection, tj. zapomeňte na klíčové slovo new a všechno si nechte "nainjectovat".

Injektáž se obvykle provádí prostřednictvím konstruktoru, tak jak to máte v posledním příkladu.

Sám instance nevytváříte, o to se stará infrastruktura (v případě DI se jí obvykle říká "container").

Vaším úkolem je jenom příslušnou službu do containeru zaregistrovat. V případě čistého ASP.NET Core je to v metodě Startup.cs:ConfigureServices(), kde dáváte něco jako

services.AddTransient<IDbLogger, DbLogger>();

...variant registrace je několik, v zásadě se liší životním cyklem, atp.

No a samotné použití pak záleží na typu aplikace (vynechám teď záměrně infrastrukturní detaily typu composition-root, atp.), např. v ASP.NET Controlleru prostě přidáte constructor (pokud tam už není) a do něj dáte IDbLogger jako parametr. ASP.NET infrastruktura pak už zařídí, aby se tam při vzniku controlleru ta služba dostala.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback