2015-04-12 68 views
0

我有MVC4 StructureMap配置有问题,当我运行该项目,编译器火这个错误structuremap配置asp.net的MVC 4

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; 

     } 
    } 
} 

Controller类

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() 
     { 

     } 
    } 
} 

我注意到,当我添加的对象类型的参数一样

public HomeController(logger parameter) 

,而不是

public HomeController(string parameter) 

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

而不是

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

它可能工作,但与字符串参数不起作用。

所以请couold任何人都解释为我。

回答

0

从我对StructureMap的理解(如果我错了,请纠正我)你看到你看到的行为的原因是因为StructureMap将默认使用最长的构造函数并尝试填充默认实例注册到StructureMap中的参数。

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

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

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