过去我在Umbraco 6和Windsor Castle的IoC方面有过很好的经验。在与Umbraco合作超过一年后,我想让我们看看7中有什么(我喜欢后台!)
在创建一个新项目并使用NuGet安装Umbraco 7.2.1后,我根据自己的经验决定实施Windsor Castle。
安装IoC并设置installconfig后,我的后台将不再加载!请参阅以下错误:
Castle.MicroKernel.ComponentNotFoundException was unhandled by user code HelpLink=groups.google.com/group/castle-project-users HResult=-2146233088 Message=No component for supporting the service Umbraco.Web.Editors.AuthenticationController was found Source=Castle.Windsor StackTrace: at Castle.MicroKernel.DefaultKernel.Castle.MicroKernel.IKernelInternal.Resolve(Type service, IDictionary arguments, IReleasePolicy policy) at Castle.MicroKernel.DefaultKernel.Resolve(Type service, IDictionary arguments) at Castle.Windsor.WindsorContainer.Resolve(Type service) at Project.Composition.ObjectFactory.Resolve(Type type) in c:\Repositories\Project\1. Code\Project\Composition\ObjectFactory.cs:regel 24 at Project.Web.Composition.WindsorCompositionRoot.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType) in c:\Repositories\Project\1. Code\Project.web\Composition\WindsorCompositionRoot.cs:regel 22 at System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request) at System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsyncInternal(HttpRequestMessage request, CancellationToken cancellationToken) at System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) InnerException: null
我无法弄清楚发生了什么或问题是什么。我加载后台时只有这个。它已经在inlog屏幕中崩溃了。 我已经尝试了几件事: Umbraco MVC with Castle Windsor https://gist.github.com/florisrobbemont/5821863 但我无法弄明白。
编辑04-02-2015 ---->
这https://gist.github.com/florisrobbemont/5821863或多或少是我用的!你想看到更多什么?我的web.config安装程序?
这是我的启动类:
public class UmbracoBoot : IApplicationEventHandler
{
internal static IWindsorContainer Container;
public void OnApplicationInitialized(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
{
umbracoApplication.Disposed += umbracoApplication_Disposed;
}
void umbracoApplication_Disposed(object sender, System.EventArgs e)
{
Application.Stop();
}
protected void ApplicationStarting(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
{
Container = new WindsorContainer()
.Install(Configuration.FromAppConfig())
.Register(Classes.FromThisAssembly().BasedOn<IController>().LifestyleTransient());
FilteredControllerFactoriesResolver.Current.InsertType<UmbracoFilteredControllerFactory>(0);
}
public void OnApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
{
RouteConfig.Register();
FilterConfig.Register();
BundleConfig.Register();
}
public void OnApplicationStarting(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
{
Application.Create();
FilteredControllerFactoriesResolver.Current.InsertType<UmbracoFilteredControllerFactory>(0);
DependencyResolver.SetResolver(new WindsorDependencyResolver(Application.ObjectFactory));
GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerActivator), new WindsorCompositionRoot(Application.ObjectFactory));
Application.Start();
}
}
答案 0 :(得分:0)
我可能错了,但在我看来,您正在使用此行安装应用程序中的所有控制器:
.Register(Classes.FromThisAssembly().BasedOn<IController>().LifestyleTransient());
但您的Umbraco.Web.Editors.AuthenticationController可能位于不同的程序集中。尝试显式注册,或者如果需要使用Classes.FromAssemblyContaining从该程序集中注册所有Controller(可能会被确切的函数名称误解)。
古德勒克, Marwijn。
答案 1 :(得分:0)
我遇到了类似的问题,并在http://www.wearesicc.com/getting-started-with-umbraco-7-and-structuremap-v3/
使用了结构图描述的技术我已经调整了我的WindsorCompositionRoot类Create方法来检查请求是否适用于umbraco控制器,如果是,请让Umbraco解决它。方法现在看起来像这样:
public IHttpController Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType) { if (ControllersHelper.IsUmbracoController(controllerType)) { return Activator.CreateInstance(controllerType) as IHttpController; } var controller = (IHttpController)_container.Kernel.Resolve(controllerType); request.RegisterForDispose(new Release(() => _container.Kernel.ReleaseComponent(controller))); return controller; }
使用链接帖子中的IsUmbracoController方法。