我在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,所有的例子都是前一种风格而没有评论,所以我想知道我是否不理解它是如何工作的。
答案 0 :(得分:6)
不,你不能这样做。如果您尝试:
,您会发现您的应用程序会抛出异常终身经理已经注册。终身经理不能重复使用,请创建一个新的。
描述:执行当前Web请求期间发生了未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。
异常详细信息:System.InvalidOperationException:生命周期管理器已注册。终身经理不能重复使用,请创建一个新的。
答案 1 :(得分:1)
LifetimeManager
类的类,您可以重用对象。
在my book中,在第14章中,我展示了为Unity构建自定义生命周期管理器的复杂示例,最后将其注册为:
var lease = new SlidingLease(TimeSpan.FromMinutes(1));
var cache = new CacheLifetimeManager(lease);
container.RegisterType<IIngredient, Parsley>(cache);
除非Unity的生命周期管理架构在我查看之后发生了重大变化,否则每次注册时都没有理由创建新的PerRequestLifetimeManager
实例。