在Unity中的类型之间共享终身经理?

时间:2014-03-25 15:26:47

标签: c# dependency-injection unity-container

我在Unity文档中看到的示例让您通过内联new LifetimeManager()来指定生命周期管理器。所以我有这个代码:

container.RegisterType<ApplicationDbContext>(new PerRequestLifetimeManager());

container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>(new PerRequestLifetimeManager(),
          new InjectionConstructor(typeof (ApplicationDbContext)));

container.RegisterType<UserManager<ApplicationUser>>(new PerRequestLifetimeManager());

很好,但我想知道为什么我要创建这么多实例。我有什么理由不这样写它吗?

var lifetimeManager = new PerRequestLifetimeManager();

container.RegisterType<ApplicationDbContext>(lifetimeManager);

container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>(lifetimeManager,
          new InjectionConstructor(typeof (ApplicationDbContext)));

container.RegisterType<UserManager<ApplicationUser>>(lifetimeManager);

看起来很明显但是通过阅读PDF,所有的例子都是前一种风格而没有评论,所以我想知道我是否不理解它是如何工作的。

2 个答案:

答案 0 :(得分:6)

不,你不能这样做。如果您尝试:

,您会发现您的应用程序会抛出异常
  

终身经理已经注册。终身经理不能重复使用,请创建一个新的。

     

描述:执行当前Web请求期间发生了未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

     

异常详细信息:System.InvalidOperationException:生命周期管理器已注册。终身经理不能重复使用,请创建一个新的。

答案 1 :(得分:1)

IIRC,Unity生命周期只是一个派生自抽象LifetimeManager类的类,您可以重用对象。

my book中,在第14章中,我展示了为Unity构建自定义生命周期管理器的复杂示例,最后将其注册为:

var lease = new SlidingLease(TimeSpan.FromMinutes(1));
var cache = new CacheLifetimeManager(lease);
container.RegisterType<IIngredient, Parsley>(cache);

除非Unity的生命周期管理架构在我查看之后发生了重大变化,否则每次注册时都没有理由创建新的PerRequestLifetimeManager实例。