2013-08-25 52 views
0

我正在向我的MS MVC應用程序中引入DI,並且我無法從我的自定義Controller Factory中實例化控制器。看來重寫的「GetControllerInstance」沒有被調用。創建城堡溫莎控制器工廠和GetControllerInstance從未被稱爲

有人能告訴我我失蹤了什麼嗎?

我的控制器廠:

public class WindsorControllerFactory : DefaultControllerFactory 
{ 
    readonly IWindsorContainer container; 

    public WindsorControllerFactory(IWindsorContainer container) 
    { 
     this.container = container; 
     var controllerTypes = 
      from t in Assembly.GetExecutingAssembly().GetTypes() 
      where typeof(IController).IsAssignableFrom(t) 
      select t; 
     foreach (var t in controllerTypes) 
      container.Register(Component.For(t).LifeStyle.Transient); 
    } 

    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) 
    { 
     if (controllerType == null) return null; 
     return (IController)container.Resolve(controllerType); 
    } 
} 

引導:

public static void Bootstrap() 
     { 
      RouteConfigurator.RegisterRoutes(RouteTable.Routes); 
      ControllerBuilder.Current.SetControllerFactory(new WindsorControllerFactory(IoC.Container)); 
      WindsorConfigurator.Configure(); 
     . 
     . 
     } 

IOC:

public static class IoC 
    { 
     private static readonly object LockObj = new object(); 

     private static IWindsorContainer container = new WindsorContainer(); 

     public static IWindsorContainer Container 
     { 
      get { return container; } 

      set 
      { 
       lock (LockObj) 
       { 
        container = value; 
       } 
      } 
     } 

     public static T Resolve<T>() 
     { 
      return container.Resolve<T>(); 
     } 

     public static object Resolve(Type type) 
     { 
      return container.Resolve(type); 
     } 
    } 

WindsorRegistrar:

public class WindsorRegistrar 
{ 

    public static void RegisterSingleton(Type interfaceType, Type implementationType) 
    { 
    IoC.Container.Register(Component.For(interfaceType).ImplementedBy(implementationType).LifeStyle.Singleton); 
    } 

    public static void Register(Type interfaceType, Type implementationType) 
    { 
    IoC.Container.Register(Component.For(interfaceType).ImplementedBy(implementationType).LifeStyle.PerWebRequest); 
    } 

    public static void RegisterAllFromAssemblies(string a) 
    { 
    IoC.Container.Register(AllTypes.FromAssemblyNamed(a).Pick().WithService.FirstInterface().LifestylePerWebRequest()); 
    } 
} 

請幫忙嗎?

+0

您沒有在容器中註冊'WindsorControllerFactory'。這可能會導致你的麻煩。 – Steven

回答

0

我不能在第一眼發現任何錯誤,而是爲了確保您的管道是多餘的... Keept簡單按溫莎tutorial

1

有一個NuGet包,使溫莎融入MVC應用無摩擦。

PM> Install-Package Castle.Windsor.Web.Mvc