找不到支持服务System.Web.Mvc.IControllerFactory的组件 [英] No component for supporting the service System.Web.Mvc.IControllerFactory was found

查看:68
本文介绍了找不到支持服务System.Web.Mvc.IControllerFactory的组件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在温莎城堡遇到问题。请帮我!
我正在使用温莎城堡3.2.0.0,.Net 4.0和Mvc 3.0.0.0

I have an issue in Castle Windsor. Please help me! I'm using Castle Windsor 3.2.0.0, .Net 4.0 and Mvc 3.0.0.0

非常感谢!

问题:
找不到支持服务Mvc IControllerFactory的组件
这里有一些代码。

Issue: No component for supporting the service Mvc IControllerFactory was found There is some code here.

public class WindsorDependencyResolver : IDependencyResolver
{
   private readonly IWindsorContainer _container;
   public WindsorDependencyResolver(IWindsorContainer container)
   {
       this._container = container;
   }

   public object GetService(Type serviceType)
   {
       return _container.Resolve(serviceType);
   }

   public IEnumerable<object> GetServices(Type serviceType)
   {
       return _container.ResolveAll(serviceType).Cast<object>();
       //return _container.ResolveAll<object>(serviceType);
   }
}

//Castle Windsor register
protected void Application_Start()
{
var container = new WindsorContainer();

container.AddFacility<TypedFactoryFacility>()
    .Register(Component.For<IServiceFactory>().AsFactory().LifeStyle.Transient);

        //Do register the service/type to container
container.Register(
  Types.FromThisAssembly()
  .BasedOn(typeof(Controller))
  .WithService.Self().LifestyleTransient());

container.Register(
  Component.For<IRepository>()
  .ImplementedBy<GenericRepository>().DependsOn(Dependency.OnValue("context", "ProjectContext"))
  .LifeStyle.PerWebRequest);

container.Register(
  Types.FromAssembly(Assembly.GetAssembly(typeof(IUserService)))
  .BasedOn(typeof(ServiceBase))
  .WithService.DefaultInterfaces().LifestylePerWebRequest());

DependencyResolver.SetResolver(new WindsorDependencyResolver(container));
}


推荐答案

与克里斯蒂亚诺达成协议-这是我做到了,但这是两者的结合:

Agreed with Cristiano - here's how I did it, but it was a mix of both:

public class ContainerHostDependencyResolver : IDependencyResolver
{
    private static readonly IServiceLocator Locator = new ServiceLocator();
    private readonly IDependencyResolver _defaultResolver;
    private static readonly Type ControllerFactoryType = typeof (IControllerFactory);

    public ContainerHostDependencyResolver(IDependencyResolver defaultResolver)
    {
        _defaultResolver = defaultResolver;
    }

    public object GetService(Type serviceType)
    {
        if (ControllerFactoryType.IsAssignableFrom(serviceType))
            return Locator.Resolve(serviceType);

        return _defaultResolver.GetService(serviceType);
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        return _defaultResolver.GetServices(serviceType);
    }
}

    protected void Application_Start()
    {
        DependencyResolver.SetResolver(new ContainerHostDependencyResolver(DependencyResolver.Current));
    }

编辑#1:这是一种更安全,更直接的方法,它正在执行Cristiano的教程链接正在呼唤。就我而言,我将温莎包裹在我们自己的名为ContainerHost / ServiceLocator的后面。

EDIT #1: This is a safer more straightforward approach that's doing what Cristiano's tutorial link is calling for. In my case, I have Windsor wrapped behind our own their called ContainerHost/ServiceLocator.

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        ControllerBuilder.Current.SetControllerFactory(new ContainerHostControllerFactory());
    }
}

public class ContainerHostControllerFactory : DefaultControllerFactory
{
    private static readonly IServiceLocator Locator = new ServiceLocator();

    public override IController CreateController(RequestContext requestContext, string controllerName)
    {
        return Locator.Resolve<IController>(controllerName + "Controller");
    }

    public override void ReleaseController(IController controller)
    {
        Locator.Release(controller);
    }
}

这篇关于找不到支持服务System.Web.Mvc.IControllerFactory的组件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆