结构图配置asp.net mvc 4

时间:2015-04-12 10:07:35

标签: asp.net-mvc-4 structuremap

我遇到MVC4 StructureMap配置问题,当我运行项目时,编译器会触发此错误

 No Default Instance defined for PluginFamily Mace_CrmSystem.Controllers.HomeController

这是我的代码

global.aspx代码

namespace Mace_CrmSystem
{
    // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
    // visit http://go.microsoft.com/?LinkId=9394801
    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);

            RouteTable.Routes.MapRoute("Oqla", "Oqla", new { controller = "Home", action = "index" });
            RouteConfig.RegisterRoutes(RouteTable.Routes);

            ControllerBuilder.Current.SetControllerFactory(new MyCustomeFactory());
            ObjectFactory.Initialize(x => x.For<string>().Use<string>());

         }
    }


}

MycustomeFactory类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using StructureMap;
namespace Mace_CrmSystem
{
    public class MyCustomeFactory : System.Web.Mvc.DefaultControllerFactory
    {

        protected override System.Web.Mvc.IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
        {
            return  StructureMap.ObjectFactory.GetInstance(controllerType) as System.Web.Mvc.IController;

        }
    }
}

控制器类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace Mace_CrmSystem.Controllers
{
    public class HomeController : Controller
    {
        //
        // GET: /Home/

        public HomeController(string parameter)
        {
            TempData["Hi"] = "Hi";
        }

        public ActionResult Index()
        {

            return View();
        }

    }

    public class logger
    {
        public void log()
        { 

        }
    }
}

当我添加类型为object的参数时,我注意到了

 public HomeController(logger parameter)

而不是

 public HomeController(string parameter)

ObjectFactory.Initialize(x => x.For<logger>().Use<logger>());

而不是

ObjectFactory.Initialize(x => x.For<string>().Use<string>());

它可能工作但是使用字符串参数它不起作用。

所以请各位为我解释一下。

1 个答案:

答案 0 :(得分:0)

根据我对StructureMap的理解(有人请纠正我,如果我错了)你之所以看到你所看到的行为的原因是因为StructureMap默认会使用最长的构造函数尝试使用StructureMap注册的默认实例填充参数。

在您的实例中,您没有提供字符串的默认实例,因此StructureMap不知道如何解决它。

如果你想做你想做的事情,那么你最好的办法是看看创建一个自定义约定(see this answer for more information),但这些依赖于知道你的构造函数的属性名称期待。

一般来说,在处理字符串时,最好的办法是将字符串移动到中间类型,然后将其注入。