2015-04-12 69 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),但是這些確實依賴於知道構造函數期望的屬性名稱。

一般來說,當處理字符串時,最好的辦法就是將字符串移動到中間類型並注入。