Я пытаюсь удалить Service Locator из абстрактного базового класса, но я не уверен, что заменить его. Вот псевдо-пример того, что у меня есть:
public abstract class MyController : Controller
{
protected IKernel kernel;
public MyController(IKernel kernel) { this.kernel = kernel); }
protected void DoActions(Type[] types)
{
MySpecialResolver resolver = new MySpecialResolver(kernel);
foreach(var type in types)
{
IMyServiceInterface instance = resolver.Get(type);
instance.DoAction();
}
}
}
Это может быть неотъемлемо неразрешимым, потому что я не знаю, из каких типов мне придется решать. Производные классы отвечают за создание параметра types
, но они нигде не закодированы. (Типы основаны на наличии атрибутов в пределах иерархии композиций производного класса.)
Я пытаюсь исправить это с ленивыми делегатами по загрузке, но до сих пор я не придумал чистого решения.
Update
Здесь есть две проблемы: одна - контейнер IoC передается контроллеру, действуя как локатор сервисов. Это легко удалить - вы можете перемещать местоположение вверх или вниз по стеку вызовов, используя всевозможные методы.
Вторая проблема сложная: как вы можете обеспечить, чтобы контроллер имел необходимые сервисы, когда требования не отображаются до выполнения. С самого начала это должно было быть очевидным: вы не можете! Вы всегда будете зависеть от состояния локатора службы или содержимого коллекции. В этом конкретном случае никакая проблема не позволит решить проблему, описанную в в этой статье со статически типизированными зависимостями. Я думаю, что то, что я собираюсь сделать, это передать Lazy-массив в конструктор контроллера и выбросить исключение, если отсутствует требуемая зависимость.