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
{
// ...
}