У меня есть сценарий, в котором я хотел бы зарегистрировать один экземпляр компонента в контейнере, но, к сожалению, его нельзя создать при запуске приложения.Этот компонент может быть создан только с передачей некоторых объектов, которые доступны только чуть позже в жизненном цикле приложения (однако они не являются другими зарегистрированными службами IoC) [см. Примечание ниже] .
- Является ли регистрация компонента в контейнере IoC после начальной конфигурации (запуск при запуске приложения) плохой практикой?
- Как это сделать, не ссылаясь непосредственно на контейнер?Стоит ли абстрагировать службу регистрации?
- Есть лучший подход для поддержки сценария?
ПРИМЕЧАНИЕ о фактическом сценарии
компонент, который я хотел бы поместить в контейнер, инициализируется с конкретным экземпляром элемента управления пользовательского интерфейса (в основном это адаптер), поэтому мне нужно вручную создать экземпляр компонента и зарегистрировать его в контейнере.
Я бы сделалэто при запуске приложения, но, к сожалению, у меня пока нет доступного экземпляра элемента управления пользовательским интерфейсом (и при этом я не могу создать его самостоятельно).
Даже в более позднее время я не могу получить доступ к экземпляру элемента управления пользовательского интерфейса с поверхности других компонентов беззная их конкретный класс.
По этой причине я подумал, что могу возложить ответственность за регистрацию адаптера на класс, которому принадлежит элемент управления UI.
Мой начальный сценарий:
public interface IDockManager { ... }
public class AcmeDockManagerAdapter : IDockManager {
public AcmeDockManager(DockControl control) { ... }
...
}
public class ShellViewModel { ... }
public class ShellView : Window {
internal DockControl theDockControl;
}
public class AnotherViewModel {
AnotherViewModel(IDockManager dockManager) { ... }
}
Решение, которое меня не устраивает:
public class ShellView : Window {
internal DockControl theDockControl;
public ShellView () {
InitializeComponents();
var dockManager = new AcmeDockManagerAdapter(theDockControl);
//registration in the container
}
}