组合根的可选依赖
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());
}
我编写了一个 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());
}