Я вхожу в процесс интеграции 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 ...
}
}
Вы подтвердили, что ваши контроллеры правильно подобраны при сканировании? – AlexCuse
Вы можете видеть это выше в свалке контейнера – rboarman
Ах, извините, я пропустил это. Я не вижу названия в вашем выпуске, но я подозреваю, что вам просто нужно добавить «контроллер» к имени вашего контроллера - может быть, соглашение, которое вы используете, не обрезает это. – AlexCuse