我有一种情况,我创建了一个工厂方法来创建一个对象。但是,该对象具有在创建对象之前需要执行的样板代码。修复这部分设计超出了这个问题的范围。
此外,当创建对象时,屏幕上会更新状态显示。这要求此状态显示在创建此对象之前已实例化并可见,并且应用程序处于运行状态。它作为依赖项传递给工厂。
我正在使用 StructureMap 的 v3.1.4.143。
所以,这就是我在正常世界(IoC 之前)要做的事情:
GraphicsInterface GetGraphics()
{
VideoDevicesList.GetVideoDevices();
// Some logic here to determine the device to use...
// Also, a status display is being updated to inform the user of
// what's happening at this point.
VideoDevice device = ...;
// The second parameter is a constant value, but the first is not.
return new GraphicsInterface(device, featureLevels.FL5);
}
看起来很简单,但理想情况下,我希望能够通过注入传递该图形对象,因为在许多地方都需要它。
所以,在结构图中,我创建了一个工厂函数来完成上述工作。然而这让我很伤心。
new Container(obj =>
{
// This is passed to the object that depends on it.
// I've just left it out for brevity.
// It'd go something like: _graphics = _getGraphicsFactory();
// where _getGraphicsFactory is the factory function below.
For<Func<IStatusDisplay, GraphicsInterface>>
.Use<Func<IStatusDisplay, GraphicsInterface>>(GetGraphics);
}
只有这给了我一个关于未注册 GraphicsInterface 的错误。没关系,我应该可以注册 GraphicsInterface 对象。除了我无法注册 GraphicsInterface 因为构造函数需要两个参数,其中一个必须在创建对象之前查询,并且只能通过上面的 GetVideoDevices 方法设置,而且似乎 StructureMap 在我调用时试图为我创建对象_getGraphicsFactory() (这很奇怪,我希望它执行我的函数来创建对象)。
我什至尝试在 GetVideoDevices 方法中像这样调用 GetInstance:
_container
.With<VideoDevice>(device)
.With<FeatureLevel>(FeatureLevel.FL5)
.GetInstance<Graphics>();
但是没有骰子...
那么,有人知道我如何让它工作吗?