StructureMap, ObjectFactory и держатель значков
-
22-09-2019 - |
Вопрос
Я работаю со StructureMap для своих нужд IoC.
Чтобы сделать вещи приятными для тестирования, я прохожу IContainer
экземпляры повсюду, где это возможно, обычно в качестве параметров конструктора.Для удобства я хотел бы иметь возможность вернуться к использованию ObjectFactory
для конструктора без параметров.
Самый простой способ (как я думал) сделать это - просто получить IContainer
в ObjectFactory
класс переносит и передает это другому конструктору.К сожалению, я не могу найти нигде, где этот экземпляр был бы выставлен на всеобщее обозрение.
Вопрос в том,:
Есть ли способ получить IContainer
внутри ObjectFactory
значит, я могу справиться с этим так же просто, как с предоставленным пользователем экземпляром?
В качестве альтернативы, есть ли способ дублировать конфигурацию ObjectFactory
в новый Container
пример?
Пример:
Я хотел бы иметь возможность сделать следующее:
public class MyClass
{
public MyClass()
{
Container = ... // The ObjectFactory container instance.
}
public MyClass(IContainer container)
{
Container = container;
}
public IContainer Container { get; private set; }
}
Решение
ObjectFactory предоставляет свойство контейнера, которое предоставляет вам IContainer, который вы ищете.
В любое время, когда вам нужен IContainer (что не должно быть часто), вы всегда можете установить зависимость от него в вашем классе ctor.
public class INeedAContainer
{
private readonly IContainer _container;
public INeedAContainer(IContainer container)
{
_container = container;
}
// do stuff
}
Я не думаю, что есть способ клонировать IContainer.Существует контейнер.Метод GetNestedContainer(), который позволяет вам сохранять ваши переходные процессы неизменными в течение всего срока службы вложенного контейнера.Вложенные контейнеры часто используются в инструкции "using" и очень удобны для управления состоянием таких вещей, как границы транзакций базы данных.