Zdrojové kódy pro vývojáře.
Skip Navigation Links. Top 10 přispěvatelů
UživatelČlánky
codeshare49
sochor1
stoupa1
tomas.oplt11
Článek: Inversion of control + Dependency injection ( IOC + DI )
Špatný Super
Autor:
Vytvořeno:
Popularita:

Jedná se o návrhový vzor. Pokud nevíte co jsou návrhové vzory, bude dobré si nejprve přečíst něco o návrhových vzorech. Inversion of control znamená přesunutí odpovědnosti za vytváření závislé(dependency) třídy mimo jinému objektu mimo třídu, která závislý objekt používá(consumer). Je to pro začátek hodně nepochopitelné takže to zkusíme na nějakém příkladu z praxe:

Pokud v nějaké třídě vytváříte instanci jiné třídy vznikají mezi těmito třídami závislosti. Příklad:

public class SearchEngine  
{
private SearchService searchSvc;
public SearchEngine()
{
searchSvc = new SearchSvc();
}
}

V tomto případě vznikla závislost mezi třídou SearchEngine(consumer) a SearchSvc(dependency). Závislosti ( tightly coupling ) mezi třídami mají tyto nevýhody:

Domino efekt - změna v jedné třídě vyvolá potřebu změny v ostatních závislých třídách. Riziko roste s velikostí projektu. Znovupoužitelnost třídy se snižuje. Obvykle to poznáte tak, že pokud chcete jednu třídu použít v jiném projektu musíte k ní přidružit ještě dalších 5 a nebo zjistíte, že jí samostatně nelze vůbec použít. V případě, že budeme chtít vyhledávat například pomocí regulárních výrazů, budeme muset kód přepsat. Zkusíme vytvořit nové řešení - vytvoříme interface ISearchService a každá třída, kterou budeme chtít použít pro vyhledávání v textu bude muset implementovat toto rozhraní. Všimněte si ale, že třída SearchEngine vytváří konkrétní instanci třídy TextSearchService. Jak to provést, aby bylo možné automaticky vytvořit konkrétní typ mimo třídu SearchEngine.

public interface ISearchService  
{
void Search()
}

public class TextSearchService : ISearchService
{
public void Search()
{
// vyhledáme text
}
}

public class RegularTextSearchService : ISearchService
{
public void Search()
{
// vyhledáme text
}
}

public class SearchEngine
{
private ISearchService searchSvc;
public SearchEngine()
{
searchSvc = new TextSearchService();
}
}

Teď potřebujeme přesunout zodpovědnost za vytvoření konkrétního typu do ServiceLocatoru.
ServiceLocator pak budeme předávat jako parametr kontruktoru třídy SearchEngine.

public interface IServiceLocator 
{
ISearchService GetSearchService();
}
public class SearchEngine   
{
private ISearchService searchSvc;

public SearchEngine(IServiceLocator locator)
{
searchSvc = locator.GetSearchService();
}
}

Případně můžeme ještě vytvořit generickou verzi ServiceLocatoru:
public interface IServiceLocator 
{
TClass GetSearchService();
}
public class SearchEngine   
{
private ISearchService searchSvc;


public SearchEngine(IServiceLocator locator)
{
searchSvc = locator.GetSearchService();
}
}

Dependency injection nepoužívá ServiceLocator. Namísto něho programátor vytvoří Property případně parametr konstruktoru třídy.
Při běhu programu se pak tyto proměnné automaticky naplní správným typem (Injection). 

Ukázka parametrického kontruktoru:
public class SearchEngine   
{
private ISearchService searchSvc;


public SearchEngine(ISearchService searchSvc)
{
this.searchSvc = searchSvc;
}
}

Ukázka pomocí property injection:
public class SearchEngine   
{

public ISearchService SearchService
{

get;
set;
}
}


 

  Na stránku 
screen  Nový příspěvek
Název  Uživatel  Datum 
Poslední návštěva: 16:01:02, 29. března 2024 První  Předchozí  0 Záznamů  Další  Poslední  

Autor článku
Jméno
Pracovní pozice
Informace
Foto

   

Počet návštěvníků:1
 
  Kontakt