【问题标题】:StructureMap not resolving controller instances in MVC3 applicationStructureMap 未解析 MVC3 应用程序中的控制器实例
【发布时间】: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


【解决方案1】:

就像您在 cmets 中指出的那样,您的控制器没有按名称注册。试试这个:

container.Configure(x => x.Scan(y =>
{
    y.TheCallingAssembly();
    y.WithDefaultConventions();
    y.LookForRegistries();
    y.AddAllTypesOf<Controller>()
         .NameBy(type => type.Name.Replace("Controller", "")
         .ToLowerInvariant());
}));

【讨论】:

    猜你喜欢
    • 2010-10-29
    • 2015-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多