2017-07-17 2 views
0

Ich versuche, die Verwendung von Service Locator zu vermeiden. Der vorherige Code sieht folgendermaßen aus:Vermeiden Sie die Verwendung von ServiceLocator

Ich verwende Autofac als IoC. I don t wanna use ILifetimeScope or IContainer` oder ähnlich. Können Sie Ihre Ideen zur eleganten Implementierung einer generischen Methode zum Erstellen von Repositorys ohne Verwendung von Service Locator und einer Einführung von IoC-Abhängigkeiten teilen?

Antwort

1

Unabhängig davon, ob Sie die Service Locator anti-pattern anwenden, hängt davon ab, wo dieser Code located, denn:

Ein DI-Container in einem Composition Root verkapselt kein Service Locator ist - es ist eine Infrastrukturkomponente.

Mit anderen Worten, falls Ihr UnitOfWork ist innerhalb die Zusammensetzung Wurzel gelegt, Sie sind der Service Locator anti-Muster nicht anwenden und Ihr Code ist in Ordnung.

Natürlich würde dies es für den Anwendungscode CreateRepository unmöglich machen, seit dem Composition Root depends on all other code in Ihrer Lösung, während nichts von der Composition Root abhängt.

Dieses Problem wird jedoch leicht gelöst, indem eine Schnittstelle aus dieser Klasse extrahiert und diese Schnittstelle in die Schicht platziert wird, die ihre Verwendung erfordert. Zum Beispiel:

// Core layer 
public interface IUnitOfWork 
{ 
    T CreateRepository<T>() where T : IRepository; 
} 

// Composition Root 
public class UnitOfWork : IUnitOfWork 
{ 
    // ... 
} 
Verwandte Themen