【发布时间】:2018-10-10 16:33:23
【问题描述】:
我想为用户创建的每个项目实现一个应用程序范围的容器和一个(嵌套的)容器。我查看了Owned<T>,但随后-据我所知-我的内部项目集合必须是<Owned<Project>>,这是我不想要的,而且我未能将项目依赖项注入到内部使用的对象中项目范围(“循环组件依赖”)。我考虑在项目工厂中使用新的 ContainerBuilder,但后来缺少“嵌套”方面。
我想要一些类的例子(带有依赖项):
- 在全球范围内:
ProjectManager(IProjectFactory) - 在每个项目的范围内:
Project(IDocumentFactory documentFactory)、Document(IProject project, IProjectSettings settings)。
因此,对于项目范围,我将注册 IDocumentFactory、IProjectSettings(以及项目本身?)。
当一个项目被关闭/释放时,所有创建的依赖项当然也应该被释放。
如果可能,具体类(ProjectFactory 除外)应该与 Autofac 无关。
仅供参考:该应用程序是使用 C# 和 Autofac 4.8 的桌面应用程序。
谢谢!
更新:感谢您的 cmets,讨论帮助我找到了自己的意见。目前我正在我的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第一次调用其Dispose方法时会引发Disposing事件。 - 工厂保留
Dictionary<Project, ILifetimeScope>,并在项目处置时清理。
【问题讨论】:
-
实际上,我突然想到,您可能希望在项目中拥有一些文档集合并在某处使用它,例如,在 UI 上向用户显示文档名称。在这种情况下,我建议不要使用 autofac 来管理文档。 Container 没有提供范围内当前可用文档列表的功能,因此您必须在项目中跟踪它们。但是现在您正在引入生命周期管理的冲突 - 现在项目和容器关心文档对象的生命周期,谁应该负责处置它们?
-
所以,请澄清这个系统的非常高级的功能,以便我们了解所涉及实体的生命周期。最好不要提供您对实现的想法,因为如果没有先解决设计问题,它将没有用处。
-
我了解您关于冲突处置链的想法,并且正在考虑仅对工厂使用 autofac - 也是因为我期望解决每个实例(文档和嵌套项)的依赖关系会带来性能损失.
标签: c# autofac ioc-container