Круговая зависимость в приложении winforms с использованием Castle Windsor

Я немного экспериментировал с Castle winforms в проекте winforms. Я хотел зарегистрировать все свои зависимости от формы в Castle Windsor. Таким образом, у меня будет один экземпляр для всех моих форм. Однако теперь у меня есть некоторые проблемы. Я нахожусь в ситуации, когда форма x зависит от формы y, а форма y зависит от формы x. Практический пример может быть:

форма x используется для создания заказа, форма y — это экран со списком клиентов. В форме x есть кнопка для выбора клиента для заказа. Это откроет форму y, где вы можете найти клиента. Есть кнопка, позволяющая добавить найденного покупателя в заказ. Он вызовет метод формы x и передаст выбранный объект клиента. Я мог бы сделать это с помощью событий. Создайте событие в форме y и прослушайте его в форме x. Но нет ли способа обойти круговую зависимость в замке Виндзор, ленивую регистрацию или что-то в этом роде?

Может кто-нибудь мне помочь?

заранее спасибо


person Sven    schedule 17.08.2009    source источник


Ответы (4)


Учитывая, что в любом случае очень сложно смотреть на класс формы и знать, как его вызывать/использовать; Я думаю, что наличие интерфейса для каждой формы может быть полезным в любом случае. Или использовать фабричные методы для создания/отображения/получения_результатов для каждой формы.

В конце концов, использование интерфейсов — это нормальный способ справиться с циклическими зависимостями.

person Ian Ringrose    schedule 17.08.2009
comment
Я не совсем понимаю, что вы имеете в виду. Вы предлагаете использовать что-то вроде шаблона MVP, или я совсем не согласен? Спасибо за ответ - person Sven; 18.08.2009
comment
Он предлагает вместо ссылки FormA FromB иметь ссылку FormA на IFormB, где IFormB содержит только те методы и свойства, которые вам действительно нужны. - person George Mauer; 19.08.2009

Вы можете использовать средство EventWiring, чтобы разорвать тесную связь и направить события из одной формы в другую.

person Mauricio Scheffer    schedule 17.08.2009
comment
Это действительно хороший способ маршрутизировать мои события и не быть тесно связанным, пока не знаю, хочу ли я переключиться на события. Это хорошее архитектурное решение использования событий в моем сценарии. Разве я не в конечном итоге с большим количеством различных событий. Если бы я нашел способ преодолеть мою тупиковую ситуацию и вызвал бы такой метод, как formX.AddCustomerToOrder(Customer C), я снова был бы более тесно связан... - person Sven; 18.08.2009

Я думаю, что вам нужна ссылка на вашу форму

Судя по тому, что вы сказали, ваш проект не будет компилироваться из-за приоритета заголовка.

То, как вы это напишете, зависит от вашего языка программирования.

Если ваша проблема возникает во время выполнения из-за ссылки на нулевой указатель, вы можете попытаться инициализировать каждую форму во время загрузки, затем подключить все и зарегистрироваться в своем менеджере for.

person Eric    schedule 17.08.2009
comment
Что вы имеете в виду под приоритетом заголовка? Вы имеете в виду, что если я зарегистрирую один компонент перед другим, это решит мою проблему. (потому что это не работает, пробовал) Или вы имеете в виду регистрацию определенной формы в более поздний момент времени. Если да, то где и когда это будет подходящим местом? - person Sven; 18.08.2009

Я сделал следующее, чтобы решить мою проблему. Не знаю, можно ли это рассматривать как чистый дизайн. Может ли кто-нибудь дать мне комментарии по моему методу?

public static class FormManager
{
    private static IWindsorContainer container;
    public static void Init()
    {
        container = new WindsorContainer()
            .Install(Configuration.FromXmlFile("windsor.config"));

        IoC.Initialize(container);
    }

    public  static T GetInstance<T>()
    {
        return container.Resolve<T>();
    }
}

Теперь каждая форма, которая нуждается в зависимости от формы, получит такой экземпляр:

FormManger.GetInstance<FormX>();

Это решило мою проблему циклической зависимости.

Это чисто?

person Sven    schedule 20.08.2009
comment
Кажется, это нормально. По крайней мере, кто-то, кто, кажется, знает, что делает, делает то же самое: tinyurl.com/ygd2wb5 (прокрутите вниз до Сервисного локатора/Фасада). - person dummy; 09.10.2009