2013-08-25 2 views
0

Я представляю DI в мое приложение MS MVC, и у меня возникли проблемы с получением контроллеров, созданных из моей настраиваемой фабрики контроллеров. Кажется, что переопределенное «GetControllerInstance» не вызывается.Создание фабрики контроллеров виндзорского замка и GetControllerInstance никогда не называется

Может ли кто-нибудь сказать мне, что мне не хватает?

My Controller Factory:

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); 
    } 
} 

Bootstrap:

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 
Смежные вопросы