У меня возникла ситуация, когда я создал фабричный метод для создания объекта. Тем не менее, у объекта есть шаблонный код, который требует выполнения до создания объекта. Фиксация этой части дизайна выходит за рамки этого вопроса.StructureMap и объекты, не настроенные для DI/IoC
Также, когда объект создан, на экране обновляется отображение состояния. Для этого требуется, чтобы этот индикатор состояния был создан раньше и был видимым, и приложение должно находиться в рабочем состоянии перед созданием этого объекта. Он передается фабрике в качестве зависимости.
Я использую v3.1.4.143 из StructureMap.
Итак, вот что я буду делать в нормальном мире (до 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() (что странно, я бы ожидал, что он выполнит мою функцию для создания объекта).
Я попытался даже называя GetInstance как это внутри моего метода GetVideoDevices:
_container
.With<VideoDevice>(device)
.With<FeatureLevel>(FeatureLevel.FL5)
.GetInstance<Graphics>();
Но не кости ...
Итак, кто-нибудь есть идеи о том, как бы я получить эту работу ?
Итак, я создал абстрактную фабрику и создал специализированный сервис, который дает мне видеоустройство, которое я хочу. Это все работает. Однако, когда я ввожу свой экземпляр ISplash на фабрику, это совершенно другой экземпляр, чем тот, который был передан моему контексту приложения. Я думал, что StructureMap будет передавать один и тот же экземпляр конструкторам. Наверное, я ошибся? И если да, то каким образом я могу передать только один экземпляр? (Я не уверен, что мне нужны синглтоны здесь, но если это то, что я должен делать ...) – Mike
Также я узнал, что если я использую ForConcreteType, он передает один и тот же экземпляр всем конструкторам. Но мне это кажется странным. – Mike
И неважно ... конечно, я был глупым и неправильно определил мои конструкторы (используя конкретные типы вместо интерфейсов). Теперь поведение точно так, как я ожидал. – Mike