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

时间:2014-09-26 03:58:27

标签: c# castle-windsor

我已将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,它说&#34;只有分配,呼叫,增量........&#34;我进行了以下更改,代码似乎编译正常,但不注册由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,(我试图注册由IShortcutMenuProvider实现的IMenuProvider组件,但在检索时我什么都没有)

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

3 个答案:

答案 0 :(得分:1)

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

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>());

不要忘记你可以debug your container提供大量信息,也许你的某个地方配置错误,但这应该扔掉......

答案 1 :(得分:1)

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

.Register(Classes.FromAssembly(assembly)
                 .BasedOn<IMenuProvider>()
                 .WithService.FromInterface(typeof(IMenuProvider))
                 .Configure(component => component
                  .Named(areaName.ToLowerInvariant() + "." +
                   component.Implementation.Name.ToLowerInvariant()).LifestyleTransient()))

WithService.FromInterface(typeof(T))为我修复了它。

非常感谢@samy的帮助。

答案 2 :(得分:0)

请在配置前尝试添加lifestyletransient:

container.Register(
    Classes
    .FromThisAssembly()
    .BasedOn<"YourInterface">()
    .LifestyleTransient()
    .Configure(c => c.Interceptors(InterceptorReference.ForType<"YourClass">))
    .Anywhere
    .LifestyleTransient()
);