Castle windsor LifeStyleTransient()未注册(从2.5升级到3.3)
本文关键字:5升 注册 windsor LifeStyleTransient Castle | 更新日期: 2023-09-27 18:24:40
我已将Castle windsor的从2.5升级到3.3
在2.5中,我使用以下方式注册它,
Register(AllTypes.FromAssembly(assembly)
.BasedOn<IMenuProvider>()
.Configure(component => component
.Named(areaName.ToLowerInvariant() + "." +
component.ServiceType.Name.ToLowerInvariant())
.LifeStyle.Transient))
现在在3.3中,我无法使用LifeStyle.Transient,它说"只有赋值、调用、增量……"我做了以下更改,代码似乎编译得很好,但它没有注册IMenuProvider 实现的类
Register(Classes.FromAssembly(assembly)
.BasedOn<IMenuProvider>()
.Configure(component => component
.Named(areaName.ToLowerInvariant() + "." +
component.Implementation.Name.ToLowerInvariant())
.LifestyleTransient()))
根据arpan的评论,也尝试了这一点
Register(Classes.FromAssembly(assembly)
.BasedOn<IMenuProvider>()
.LifestyleTransient()
.Configure(component => component
.Named(areaName.ToLowerInvariant() + "." +
component.Implementation.Name.ToLowerInvariant())
.LifestyleTransient()))
这个问题仍然没有得到解决。
编辑:=========================================
public interface IMenuProvieder
{
//some function
}
public interface IShorcutMenuProvider:IMenuProvider
{
}
如上所示,我使用Classes.FromAssembly基于IMenuProvider注册它,当我尝试使用检索它时
ServiceLocator.Current.GetAllInstances<IShortcutMenuProvider>();
我一无所获。但如果我使用注册
container.Register(Component.For<IShortcutMenuProvider>().ImplementedBy<ShortcutMenuProvider>());
我能够检索已注册的ShortcutMenuProvider,(我试图为IShortcutMenuPProvider实现的IMenuProvider注册组件,但在检索时一无所获)
我不能注册这样的接口实现的每个类。仍在努力寻找解决方案。
如果代码没有注册IMenuProvider
实现,可能是因为它们不在传递给容器的程序集中。尝试检查组件所在的程序集。通常,使用Classes.FromAssemblyInThisApplication
是一种快速而正确的方法
container.Register(Classes
.FromAssemblyInThisApplication()
.BasedOn<IMenuProvider>()
.LifestyleTransient()
.Configure(c => c.Named(c.Implementation.Name.ToLowerInvariant())));
EDIT:您可以使用类似的代码来检查存在哪些处理程序
container.Kernel.GetAssignableHandlers(typeof(IMenuProvider));
如果没有返回处理程序,那么您应该尝试显式注册一个组件:
container.Register(Component.For<IMenuProvider>.ImplementedBy<MyMenuProvider>());
不要忘记,您可以使用大量信息调试容器,也许您在某个地方有一个配置错误的组件,但这应该会抛出。。。
好的,这是解决我的问题的解决方案,
.Register(Classes.FromAssembly(assembly)
.BasedOn<IMenuProvider>()
.WithService.FromInterface(typeof(IMenuProvider))
.Configure(component => component
.Named(areaName.ToLowerInvariant() + "." +
component.Implementation.Name.ToLowerInvariant()).LifestyleTransient()))
WithService.FromInterface(类型为(T))为我修复了它。
非常感谢@samy的帮助。
请在配置之前尝试添加lifestyletransient:
container.Register(
Classes
.FromThisAssembly()
.BasedOn<"YourInterface">()
.LifestyleTransient()
.Configure(c => c.Interceptors(InterceptorReference.ForType<"YourClass">))
.Anywhere
.LifestyleTransient()
);