Класс ServiceLocator и шаблон ServiceLocator (анти) не должны использоваться здесь. Приведенный ниже код выглядит так, как будто это паттерн Service Locator (anti), но он не совсем.
Метод CreateDataSource - это самая ранняя точка в жизненном цикле запроса, которую я нашел для составления графа вашего объекта. Здесь он используется как корень композиции. Bootstrapper - это вспомогательный класс, который вызывает конфигурацию Unity, загружает ли она ее из XML или в коде.
public class PatientService : DataService<IPatientRepository>
{
public static void InitializeService(DataServiceConfiguration config)
{
// TODO: set rules to indicate which entity sets and service
operations are visible, updatable, etc.
...
}
[WebGet]
public IQueryable<Patient> Patients()
{
return from p in CurrentDataSource.Patients select p;
}
protected override IPatientRepository CreateDataSource()
{
IUnityContainer container = new UnityContainer();
Bootstrapper.Initialise(container);
return container.Resolve<IPatientRepository>();
}
}
Так что @Roy был прав, указав вам на метод CreateDataSource (). Однако следует избегать использования ServiceLocator как класса или шаблона. К сожалению, Microsoft почти заставила всех пойти по маршруту ServiceLocator с помощью таких классов, как ServiceLocator и DependencyResolver.