【问题标题】:Autofac custom lifetime managerAutofac 自定义生命周期管理器
【发布时间】:2012-12-18 19:29:22
【问题描述】:

我在 Autofac 中没有找到一种可能性。自定义生命周期管理器。 例如,在 Windsor.Castle 中,可以编写简单地从 AbstractLifestyleManager 派生的自定义生命周期管理器。

public class MyCustomLifestyleManager : AbstractLifestyleManager
{
 public overrid object Resolve(CreationContext context)
 {
 ...
 }

}

有人知道如何在 autofac 中做到这一点吗?我知道标准的终身经理,但问题是我可以自己制作吗?

【问题讨论】:

  • 您希望增加什么样的生活方式?根据我的经验,很少需要真正的新生活方式,其中大多数都可以通过注册代表来实现。
  • 我在下面评论了这个。但我重复一遍:) 例如,我想像这样注册 UI 表单 - container.RegisterType().Singleton().ExternallyOwned() 表单可以由用户关闭。因此,我更喜欢这样的东西——(在 Resolve 函数中)。 if (myForm.IsDisposed) 并且在这种情况下容器生成了新表单。在其他情况下 - 返回之前创建的表单
  • @evgeniy.chepurnykh 解决方案是..??

标签: c# dependency-injection autofac lifetime


【解决方案1】:

我认为您希望使用自定义生命周期范围,请参阅 the Autofac blog post 了解此内容。

Autofac 在生命周期范围内满足工作单元的需求。生命周期范围 (ILifetimeScope) 就像它听起来的那样——一个完成时的范围,一组的生命周期 相关组件将结束。

在处理工作单元期间解析的组件实例得到关联 具有生命周期的范围。通过跟踪实例化顺序并确保依赖关系可以 只有在相同或更长生命周期范围内的组件才能满足,Autofac 可以 生命周期结束时负责处置。

This question 提供示例代码。

【讨论】:

  • 这不一样。例如,我想注册这样的 UI 表单 - container.RegisterType().Singleton().ExternallyOwned().
  • 用户可以关闭表单。因此,我更喜欢这样的东西——(在 Resolve 函数中)。 if (myForm.IsDisposed) 返回 null 并且在这种情况下容器生成了新的表单。在其他情况下 - 返回之前创建的表单。
【解决方案2】:

你想实现ILifetimeScopeProvider 比如RequestLifetimeScopeProvider。

【讨论】:

  • 请注意,这只存在于 Autofac MVC3 扩展中。它一般不能与 Autofac 一起使用。
【解决方案3】:

除非您在 Web 应用程序中,否则没有简单的方法来实现您自己的自定义生活方式。 Web 应用具有生命周期范围提供程序(通常用于请求范围),但其他应用没有。

如您所见,根据创建对对象执行自定义操作的方法是使用 OnActivated 或 OnActivating 事件。还有一个 OnRelease 允许您随时运行自己的自定义逻辑。但您可以自行实现扩展以使该机制在语法上看起来不错。

您还可以将委托表达式 (lambdas) 注册为依赖项,这样您就可以在那里做一些漂亮的事情。

在所有这些事情之间,你应该能够完成你想做的事情。

【讨论】:

  • 感谢您的建议。我会试试的。
猜你喜欢
  • 2012-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多