我遇到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>());
它可能工作但是使用字符串参数它不起作用。
所以请各位为我解释一下。
答案 0 :(得分:0)
根据我对StructureMap的理解(有人请纠正我,如果我错了)你之所以看到你所看到的行为的原因是因为StructureMap默认会使用最长的构造函数尝试使用StructureMap注册的默认实例填充参数。
在您的实例中,您没有提供字符串的默认实例,因此StructureMap不知道如何解决它。
如果你想做你想做的事情,那么你最好的办法是看看创建一个自定义约定(see this answer for more information),但这些依赖于知道你的构造函数的属性名称期待。
一般来说,在处理字符串时,最好的办法是将字符串移动到中间类型,然后将其注入。