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注册组件,但在检索时一无所获)

我不能注册这样的接口实现的每个类。仍在努力寻找解决方案。

Castle windsor LifeStyleTransient()未注册(从2.5升级到3.3)

如果代码没有注册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()
);