【发布时间】:2012-03-28 21:46:16
【问题描述】:
我正在将 StructureMap 集成到我的 MVC3 应用程序中。我遇到了一个问题,我的自定义 ControllerFactory 在尝试创建控制器时抛出异常:
StructureMap 异常代码:200 找不到名为的实例 PluginType System.Web.Mvc.IController 的“contentpage”
这是我在容器里的东西:
控制器(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=null
我确实注意到控制器工厂正在请求“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 ...
}
}
【问题讨论】:
-
您是否确认您的控制器已被扫描正确拾取?
-
您可以在容器的转储中看到上面的内容
-
对不起,我错过了。我在您的输出中看不到名称,但我怀疑您只需要将“控制器”附加到您的控制器名称 - 可能是您使用的约定没有修剪掉它。
-
我也试过了,不行。我不认为容器配置为按名称查找实例。
-
我认为使用 nameby 应该可以。 ControllerFactory 上还有一个采用 IIRC 类型的方法,您实际上并没有做任何特殊的命名,所以这可能也可以在这里工作。
标签: asp.net-mvc-3 structuremap