温莎IoC与Umbraco 7.2.1

时间:2015-02-02 18:28:05

标签: c# umbraco castle-windsor

过去我在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();
        }
    }

2 个答案:

答案 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方法。