我已将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组件,但在检索时我什么都没有)
我不能像这样注册接口实现的每一个类。 仍在努力寻找解决方案。
答案 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()
);