Я нахожусь в процессе интеграции StructureMap в мое приложение MVC3. Я сталкиваюсь с проблемой, когда мой пользовательский ControllerFactory выдает исключение при попытке создать контроллер:
Код исключения StructureMap: 200 Не удалось найти экземпляр с именем
"contentpage" для PluginType System.Web.Mvc.IController
Вот что у меня в контейнере:
Контроллер (System.Web.Mvc.Controller)
Определено как: переходный процесс
AuctionCMS.Web.Controllers.HomeController, AuctionCMS.Web,
Версия = 1.0.0.0, Культура = нейтральная,
AuctionCMS.Web.Controllers.ContentPageController, AuctionCMS.Web,
Версия = 1.0.0.0, Культура = нейтральная, PublicKeyToken = null Сконфигурировано
Экземпляр AuctionCMS.Web.Controllers.ContentPageController,
AuctionCMS.Web, версия = 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 ...
}
}