使用Castle Windsor在winforms app中的循环依赖

时间:2009-08-17 14:49:18

标签: winforms castle-windsor

我正在winforms项目中尝试使用Castle winforms。我想用Castle windsor注册我所有的表单依赖项。这样我就可以为我的所有表单创建一个实例。 现在我有一些问题。 我处于这样一种情况,即x形式依赖于形式y,形式y依赖于形式x。实际例子可能是:

表单x用于创建订单,表单y是具有客户列表的屏幕。 从表单x有一个按钮,用于选择订单的客户。这将打开y,您可以搜索客户。有一个按钮,可以将找到的客户添加到订单中。它将调用表单x上的方法并传递选定的客户对象。我可以用事件做到这一点。以y形式提升事件并以x形式监听。但是,在温莎城堡(Round Windsor)的循环依赖,懒惰的注册还是其他方面,是不是有办法呢?

任何人都可以帮助我吗?

提前致谢

4 个答案:

答案 0 :(得分:3)

鉴于很难看到表单类并且知道如何调用/使用它;我认为为每个表单设置一个界面可能会有所帮助。或者使用工厂方法为每个表单创建/ show / get_results。

使用接口完全是处理循环依赖关系的常用方法。

答案 1 :(得分:1)

您可以使用EventWiring facility打破紧密耦合,并将您的活动从一种形式转移到另一种形式。

答案 2 :(得分:1)

我认为您想要的是对表单的前瞻性参考

按照你的说法猜测,你的项目因为标题优先而无法编译

你如何写它完全取决于你的编程语言

如果由于空指针引用而在运行时出现问题,您可以尝试在加载期间初始化每个表单,然后连接所有表单并注册到您的经理。

答案 3 :(得分:1)

我做了以下事情来解决我的问题。不知道它是否可以被视为干净的设计。谁能给我评论我的方法?

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>();

这解决了我的循环依赖问题。

这个干净吗?