2012-07-24 36 views
1

我已經得到了控制器的參數構造函數的問題,爲了解決這個問題,我將使用StructureMap初始化structuremap

我加入這個類

public class StructureMapControllerFactory : DefaultControllerFactory 
{ 
    public override IController CreateController(RequestContext requestContext, string controllerName) 
    { 
     try 
     { 
      string key = controllerName.ToLowerInvariant(); 
      return ObjectFactory.GetNamedInstance<IController>(key); 
     } 
     catch (StructureMapException ex) 
     { 
      //Use the default logic. 
      return base.CreateController(requestContext, controllerName); 
     } 
    } 
} 

我添加

ControllerBuilder.Current.SetControllerFactory(new StructureMapControllerFactory()); 
在Global.asax.cs中

到的Application_Start(),但我有錯誤,可能是因爲我不INI tialize StructureMap 如何正確地初始化此僅使用ControllerFactory?

+0

您正在使用什麼版本的MVC的? – 2012-07-24 19:38:49

+0

如果構造函數參數少,爲什麼你需要StructureMap? sm是否注入屬性依賴關係?它是否管理對象生命週期? – 2012-07-25 12:35:36

+0

@ShaneFulmer,我使用MVC3。 – takayoshi 2012-07-25 14:24:05

回答

1

您需要在某處註冊您的依賴關係。有幾種方法可以在結構圖文檔中閱讀。

還有一個名爲StructureMap.MVC3的NuGet包,它根據項目網站獲得了一切可用的工具。我沒有測試過我的自我。

這裏是用一個控制器

控制器

public class MyController : Controller 
{ 
    private readonly IRepository repository; 

    public MyController(IRepository repository) 
    { 
     this.repository = repository; 
    } 

    public ActionResult Index() 
    { 
     ViewBag.Message = repository.GetData(); 

     return View(); 
    } 
} 

的Global.asax

protected void Application_Start() 
{ 
    AreaRegistration.RegisterAllAreas(); 

    ObjectFactory.Initialize(a => a.For<IRepository>().Use<Repository>()); 
    ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory()); 

    RegisterGlobalFilters(GlobalFilters.Filters); 
    RegisterRoutes(RouteTable.Routes); 
} 

一個網站在我的ControllerFactory

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

012一個簡單的例子

StructureMap.MVC3