【问题标题】:unity container class with different lifetimes具有不同生命周期的统一容器类
【发布时间】:2016-06-06 13:03:12
【问题描述】:

我目前正在我的UnityConfig.cs 中执行以下操作,UnityMvcActivator 在App_Start 调用它:

container.RegisterType<IUserDal, UserDal>(new PerRequestLifetimeManager());

我也在这样做:

container.RegisterType<IEmailObserver, EmailObserver>(new ContainerControlledLifetimeManager());

我应该提到IUserDal 在IEmailObserver 的构造函数中:

public EmailObserver(IUserDal userDal);

现在我想在应用程序启动时启动EmailObserver 实例,所以我有这个:

`DependencyResolver.SetResolver(new UnityDependencyResolver(container));

container.Resolve<IEmailObserver>();//this line fails

我得到的错误信息是:

Exception is: InvalidOperationException - The PerRequestLifetimeManager can only be used in the context of an HTTP request. Possible causes for this error are using the lifetime manager on a non-ASP.NET application, or using it in a thread that is not associated with the appropriate synchronization context.

我正在尝试实现Observer Pattern,但我想使用 Unity 注册我的观察者并在应用启动时对其进行初始化。

【问题讨论】:

  • 您可能调用container.Resolve() 太早了(当时还没有HTTPContext 可用)。你到底在哪里称呼它?它是在Application_Start() 期间调用的代码的一部分吗?

标签: c# asp.net-mvc-4 unity-container observer-pattern


【解决方案1】:

检查 EmailObserver 构造函数 - 我认为那里的所有类型也应该是单音的。

【讨论】:

  • 我觉得这是问题所在,但请查看我的编辑,IUserDal 是 PerRequest,IEmailObserver 是 ContainerControlled
  • 所以 UserDal 应该是单调的,或者 EmailObserver 应该是每个请求的。
  • 这是我想要确定的,所以基本上统一一个类及其所有依赖项必须共享同一个生命周期管理器?
  • 不。但是当您想在没有任何请求的情况下创建 EmailObserver(作为单音)时,Unity 尝试解决所有依赖关系并发现它应该创建 UserDal 作为构造函数参数。在创建 UserDal 时,Unity 注意到此时没有请求,也无法创建 UserDal 和 EmailObserver。
  • 单调不能在构造函数参数中使用实例,应该根据请求创建,因为单调构造函数在应用程序生命周期中调用一次。使用您的实现来更新 UserDal 实例 insilde EmailObserver 每个请求是不可能的
猜你喜欢
  • 1970-01-01
  • 2018-02-15
  • 2020-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多