2012-03-28 2 views
1

Я вхожу в процесс интеграции StructureMap в мое приложение MVC3. Я бегу в проблему, где мой заказ ControllerFactory бросает исключение при попытке создать контроллер:StructureMap не разрешает экземпляры контроллера в приложении MVC3

StructureMap Exception Код: 200 Не удалось найти экземпляр с именем «contentpage» для PluginType System.Web.Mvc. IController

Вот что я имею в контейнере:

Controller (System.Web.Mvc.Controller)
контекстными как: Переходный

AuctionCMS.Web.Controllers.HomeController, AuctionCMS.Web, Version = 1.0.0.0, культура = нейтральной,

AuctionCMS.Web.Controllers.ContentPageController, AuctionCMS.Web, Version = 1.0.0.0, Culture = нейтрально, PublicKeyToken = нуль Настроенные инстанции AuctionCMS.Web.Controllers.ContentPageController, AuctionCMS.Web, Version = 1.0.0.0, культура = нейтральной, PublicKeyToken = нуль

Я заметил, что контроллер завод запрашивает «contentpage» вместо «contentpagecontroller» «Это правильное поведение? Что происходит не так?

Вот мой код:

private void InitStructureMap() 
    { 
     var container = new StructureMap.Container(); 

     DependencyResolver.SetResolver(new StructureMapContainer(container)); 
     ControllerBuilder.Current.SetControllerFactory(new StructureMapControllerFactory(container)); 

     PerformRuntimeDepdendencyConfiguration(container); 
    } 



    private void PerformRuntimeDepdendencyConfiguration(IContainer container) 
    { 
     container.Configure(x => x.Scan(y => 
     { 
      y.TheCallingAssembly(); 
      y.WithDefaultConventions(); 
      y.LookForRegistries(); 
      y.AddAllTypesOf<Controller>(); 
     })); 
    } 



public class StructureMapContainer : IDependencyResolver 
{ 
    static IContainer _container; 

    public StructureMapContainer(IContainer container) 
    { 
     _container = container; 
    } 

    public object GetService(Type serviceType) 
    { 
     if (serviceType.IsAbstract || serviceType.IsInterface) 
     { 
      return _container.TryGetInstance(serviceType); 
     } 
     else 
     { 
      return _container.GetInstance(serviceType); 
     } 
    } 

    public IEnumerable<object> GetServices(Type serviceType) 
    { 
     return _container.GetAllInstances<object>().Where(s => s.GetType() == serviceType); 
    } 
} 


    public class StructureMapControllerFactory : IControllerFactory 
    { 
     private readonly IContainer _container; 

     public StructureMapControllerFactory(IContainer container) 
     { 
      _container = container; 
     } 

     public IController CreateController(RequestContext requestContext, string controllerName) 
     { 
      System.Diagnostics.Debug.WriteLine(_container.WhatDoIHave()); 

      return _container.GetInstance<IController>(controllerName.ToLowerInvariant()); 
     } 

     public SessionStateBehavior GetControllerSessionBehavior(RequestContext requestContext, string controllerName) 
     { 
      return SessionStateBehavior.Default; 
     } 

     public void ReleaseController(IController controller) 
     { 
      return; 
     } 
    } 

public class ApplicationRegistry : Registry 
{ 
    public ApplicationRegistry() 
    { 
     ... register some types ... 
    } 
} 
+0

Вы подтвердили, что ваши контроллеры правильно подобраны при сканировании? – AlexCuse

+0

Вы можете видеть это выше в свалке контейнера – rboarman

+0

Ах, извините, я пропустил это. Я не вижу названия в вашем выпуске, но я подозреваю, что вам просто нужно добавить «контроллер» к имени вашего контроллера - может быть, соглашение, которое вы используете, не обрезает это. – AlexCuse

ответ

1

Как вы заметили в комментариях, ваши контроллеры не зарегистрированы по имени. Попробуйте следующее:

container.Configure(x => x.Scan(y => 
{ 
    y.TheCallingAssembly(); 
    y.WithDefaultConventions(); 
    y.LookForRegistries(); 
    y.AddAllTypesOf<Controller>() 
     .NameBy(type => type.Name.Replace("Controller", "") 
     .ToLowerInvariant()); 
})); 
Смежные вопросы