Всем привет!
Как-то быстро тема перешла от ServiceLocator к IoC-контейнеру. Я бы хотел остановиться на поставленном вопросе: В чем отличие ServiceLocator от Factory?
Точные определения можно найти в книжках и википедиях. Здесь я хочу изложить основные моменты.
1. ServiceLocator - объект, который хранит в себе соответствие между интерфейсами с их реализациями. SL может регистрировать новые интерфейсы. По запросу к SL может по интерфейсу создать сохраненную в нем реализацию. SL нужен для пассивного внесения зависимостей.
Классическая реализация ServiceLocator:
-
public static class ServiceLocator
{
-
private static readonly Dictionary<Type, Type> services = new Dictionary<Type, Type>();
-
public static void RegisterService<t>(Type service)
{
-
services[typeof (T)] = service;
}
-
public static T Resolve<T>()
-
{
return (T) Activator.CreateInstance(services[typeof (T)]);
-
}
}
Например, в SL можно добавить соответствие между интерфейсом IMailService и классом EmailService, который реализует этот интерфейс. Использование ServiceLocator будет выглядеть так:
1: public class SomeClass
2: {
3: private readonly IMailSender mailSender;
5:
6: public SomeClass() : this(ServiceLocator.Resolve<IMailSender>())
7: {
8: }
9:
10: public SomeClass(IMailSender mailSender)
11: {
12: this.mailSender = mailSender;
В данном случае SL используется, чтобы скрыть реализацию класса IMailSender для его безболезненной подмены на другую реализацию.
2. Factory - объект, который умеет создавать класс или определенную группу классов. Внутри фабрики может происходить конфигурация создаваемых объектов. Фабрика может использовать ServiceLocatory или IoC-контейнер для создания объектов.
В дополнение хотел бы привести ссылки:
--
Best regards,
Byndyu Alexander