组合根的可选依赖

Optional Dependency at Composition Root

我编写了一个 WPF 应用程序,它有两个不同的主程序 windows。通过在数据库中查找哪种类型的用户正在使用该程序,直到运行时我才知道要启动哪个程序。我目前使用的代码有效,但 Castle Windsor 正在通过更新两种 windows.

的对象图来做大量额外工作
    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();
    }

如何推迟 window 对象的创建而不求助于创建基本上会复制 Castle Windsor 所做的抽象工厂?

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

不过我不会自己实现工厂,让 Windsor 来实现 (via a Typed Factory)。

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

   //optionally
   void DestroyWindow(IWindow window);
}

现在你只需要告诉温莎为那个接口建立一个工厂

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