Внедрить ВМ в пользовательский элемент управления в WPF с помощью Unity - PullRequest
0 голосов
/ 09 августа 2011

Я создаю приложение на основе WPF. Я использую Unity для внедрения всех различных зависимостей в мое приложение (определено в App.xaml.cs). В моем окне MainApplication у меня есть довольно сложный пользовательский элемент управления без внешнего вида, полученный из Control (в него встроено еще около десяти элементов управления). Я хотел бы добавить виртуальную машину в этот пользовательский элемент управления, не связывая ее с любым другим объектом в моем приложении (за исключением, конечно, App.xaml.cs)

Инъекция в любое окно WPF в моем приложении работает хорошо, но когда я пытаюсь внедрить пользовательский элемент управления, я сталкиваюсь с другой ситуацией: 1. Если я использую container.RegisterInstance (container.Resolve);

DI создает фиктивный экземпляр MyCustomControl и внедряет виртуальную машину (используя атрибут [Dependency]). Однако этот конкретный экземпляр не используется, когда я использую его в своем XAML:

, в этом случае он инициализирует новый MyCustomControl, игнорируя любые зависимости.

  1. Если я использую container.RegisterType ();

MyCustomControl полностью игнорирует инъекцию.

Я понимаю, что, возможно, я делаю что-то не так (не только технически), и я действительно стараюсь не связывать этот элемент управления (что, очевидно, решит проблему).

1 Ответ

0 голосов
/ 25 августа 2011

Я не знаю, является ли это лучшим решением, и нашел ваш вопрос, когда искал другие варианты, но, увы, вот подход, который я использовал, чтобы по крайней мере начать работу.

Я создал базовый класс UnityControl, который подклассов Control. В конструкторе я использую ServiceLocator, чтобы получить ссылку на контейнер. Затем я вызываю метод BuildUp для разрешения любых зависимостей от производного класса управления. Любые зависимости реализованы как свойства чтения / записи, помеченные атрибутом DependencyAttribute.

Вот как выглядит UnityControl:

public abstract class UnityControl : Control
{
    protected UnityControl() : base()
    {
        Container = ServiceLocator.Current.GetInstance<IUnityContainer>();
        Container.BuildUp(this.GetType(), this);
    }

    protected IUnityContainer Container { get; private set; }
}
...