Я хотел бы реализовать контейнер для всего приложения и (вложенный) контейнер для каждого проекта, созданного пользователем. Я изучил Owned<T>
, но затем - насколько я мог понять - моя внутренняя коллекция проектов должна была бы быть <Owned<Project>>
, что мне не нужно, а также я не смог внедрить зависимость проекта в объекты, используемые в Объем проекта («циклическая зависимость компонента»). Я подумал об использовании нового ContainerBuilder в фабрике проекта, но тогда «вложенный» аспект отсутствует.
Несколько примеров классов (с зависимостями), которые я хотел бы получить:
- В глобальном масштабе:
ProjectManager(IProjectFactory)
- В рамках каждого проекта:
Project(IDocumentFactory documentFactory)
, Document(IProject project, IProjectSettings settings)
.
Так что для охвата проекта я бы зарегистрировал IDocumentFactory
, IProjectSettings
(и сам проект?).
Когда проект закрывается / удаляется, все созданные зависимости должны, конечно, также удаляться.
Если возможно, конкретные классы (за исключением ProjectFactory) должны быть независимыми от автофактов.
К вашему сведению: приложение представляет собой настольное приложение, использующее C # и Autofac 4.8.
Спасибо!
ОБНОВЛЕНИЕ: Спасибо за ваши комментарии, обсуждение помогло мне найти собственное мнение. В настоящее время я согласен на что-то вроде этого в моем ProjectFactory
:
public Project Create()
{
var scope = _globalScope.BeginLifetimeScope(MyIocHelper.RegisterProjectDependencies);
var p = scope.Resolve<Project>();
_projectScopes.Add(p, scope);
p.Disposing += project_Disposing;
return p;
}
На что обратить внимание:
- Насколько я могу судить, использование тега для продолжительности жизни необязательно.
Project
вызывает событие Disposing
, когда его метод Dispose
вызывается впервые.
- Фабрика хранит
Dictionary<Project, ILifetimeScope>
и очищает его при утилизации проекта.