组合根的可选依赖项

时间:2015-08-26 22:45:03

标签: wpf dependency-injection castle-windsor

我写过一个有两个不同主窗口的WPF应用程序。通过查找在数据库中使用该程序的用户类型,我不知道在运行时启动哪一个。我目前的代码有效,但Castle Windsor通过新建两种窗口的对象图来完成大量的额外工作。

    private readonly IMainWindow _mainWindow;
    private readonly ISimplifiedMainWindow _simplifiedMainWindow;

    public MainClass(
        IMainWindow mainWindow,
        ISimplifiedMainWindow simplifiedMainWindow)
    {            
        _mainWindow = mainWindow;
        _simplifiedMainWindow = simplifiedMainWindow;
    }

    public RunApp()
    { // pseudocode
        if (user is fullUser) _mainWindow.Show();
        else _simplifiedMainWindow.Show();
    }

如何推迟创建我的窗口对象而不依靠制作一个基本上会复制Castle Windsor所做的抽象工厂?

1 个答案:

答案 0 :(得分:1)

工厂实际上是我推荐的解决方案(以及我过去多次成功使用的解决方案来解决这个问题)。

我不会自己实施工厂,让温莎这样做(via a Typed Factory)。

public interface IWindowFactory
{
   IMainWindow FullUserWindow();
   ISimplifiedMainWindow SimplifiedUserWindow();

   //optionally
   void DestroyWindow(IWindow window);
}

现在您只需告诉Windsor为该界面构建工厂

container.AddFacility<TypedFactoryFacility>();
// later on, in your installer
container.Register(Component.For<IWindowFactory>()
                      .AsFactory()
                      .LifestyleTransient());

,您的应用代码更改为:

public RunApp()
{ // pseudocode
    if (user is fullUser) Show(factory.FullUserWindow());
    else Show(factory.SimplifiedUserWindow());
}