C# Castle windsor Lifestyle Transient()未注册(从2.5升级到3.3)

C# Castle windsor Lifestyle Transient()未注册(从2.5升级到3.3),c#,castle-windsor,C#,Castle Windsor,我已将温莎城堡从2.5升级到3.3 在2.5中,我使用以下方式注册它: Register(AllTypes.FromAssembly(assembly) .BasedOn<IMenuProvider>() .Configure(component => component .Named(areaName.ToLowerInvariant() + "." +

我已将温莎城堡从2.5升级到3.3

在2.5中,我使用以下方式注册它:

Register(AllTypes.FromAssembly(assembly)
                 .BasedOn<IMenuProvider>()
                 .Configure(component => component
                 .Named(areaName.ToLowerInvariant() + "." +
                        component.ServiceType.Name.ToLowerInvariant())
                        .LifeStyle.Transient))
如上所示,我正在使用Classes.FromAssembly基于IMenuProvider注册它,当我尝试使用

ServiceLocator.Current.GetAllInstances<IShortcutMenuProvider>();
ServiceLocator.Current.GetAllInstances();
我什么也得不到。但是如果我用

container.Register(Component.For<IShortcutMenuProvider>().ImplementedBy<ShortcutMenuProvider>());
container.Register(Component.For().ImplementedBy());
我能够检索已注册的ShortcutMenuProvider(我尝试为IShortcutMenuProvider实现的IMenuProvider注册组件,但检索时什么也没有得到)

我不能像这样注册接口实现的每个类。
仍在尝试找到解决方案。

请在配置之前尝试添加Lifestyle Transient:

container.Register(
    Classes
    .FromThisAssembly()
    .BasedOn<"YourInterface">()
    .LifestyleTransient()
    .Configure(c => c.Interceptors(InterceptorReference.ForType<"YourClass">))
    .Anywhere
    .LifestyleTransient()
);
container.Register(
班级
.FromThisAssembly()中的
.BasedOn()
.生活方式
.Configure(c=>c.Interceptors(InterceptorReference.ForType))
在任何地方
.生活方式
);

如果代码没有注册您的IMenuProvider实现,可能是因为它们不在传递给容器的程序集中。尝试检查组件所在的程序集。通常,一种快速正确的方法是使用
类。FromAssemblyInThisApplication

container.Register(Classes
    .FromAssemblyInThisApplication()
    .BasedOn<IMenuProvider>()
    .LifestyleTransient()
    .Configure(c => c.Named(c.Implementation.Name.ToLowerInvariant())));
如果未返回任何处理程序,则应尝试显式注册单个组件:

container.Register(Component.For<IMenuProvider>.ImplementedBy<MyMenuProvider>());
container.Register(Component.For.ImplementedBy());

别忘了,你可以使用大量信息,也许你在某个地方配置了一个错误的组件,但这应该会引发…

好的,这是解决我问题的解决方案

.Register(Classes.FromAssembly(assembly)
                 .BasedOn<IMenuProvider>()
                 .WithService.FromInterface(typeof(IMenuProvider))
                 .Configure(component => component
                  .Named(areaName.ToLowerInvariant() + "." +
                   component.Implementation.Name.ToLowerInvariant()).LifestyleTransient()))
.Register(Classes.fromsassembly(assembly)
.BasedOn()
.WithService.FromInterface(类型为(IMenuProvider))
.Configure(组件=>component
.Named(areaName.ToLowerInvariant()+“)+
component.Implementation.Name.ToLowerInvariant()).LifestyleTransient())
FromInterface(typeof(T))为我修复了它


非常感谢@samy的帮助。

我认为我无法执行InterceptorReference.ForType,因为包含此类的程序集未加载,并且程序集信息通过assembly类型的参数传递。我尝试在配置前使用Lifestyle Transient,在配置后保留零件的原样。但它仍然存在没有解决我的问题。我已检查,我传递的程序集包含IMenuProvider。我还尝试使用FromAssemblyInThisApplication(),但问题仍然没有解决。类是公共的吗?是的,它们是公共的。当我在castle.windsor 2.5上时,一切正常。升级到3.3后,我面临的问题是this@JigarSheth我编辑了我的答案,请尝试通过检查处理程序是否已注册或组件是否配置错误来减少问题的表面积
container.Register(Classes
    .FromAssemblyInThisApplication()
    .BasedOn<IMenuProvider>()
    .LifestyleTransient()
    .Configure(c => c.Named(c.Implementation.Name.ToLowerInvariant())));
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()))