有幾篇關於如何連接配置ASP.NET MVC和StructureMap的博文。 (所以大多數以下代碼是來自各個帖子的摘要。)
實現此目的的常用方法是聲明我們自己的控制器工廠類,這將允許我們通過構造函數注入我們的依賴項。 (ASP.NET MVC使用的默認控制器工廠需要默認的構造函數)
因此,在您的MyController類中,您將擁有一個接受MyManager參數的構造函數(它將由我們自己的參數爲您注入控制器工廠類)
public class MyController : Controller
{
private readonly ISomeService _someService;
//Constructor Injection.
public MyController(ISomeService someService){
_someService = someService;
}
}
下一步將配置ASP.NET MVC做使用這個新的控制器工廠類(我們將其稱爲StructureMapControllerFactory)。
protected void Application_Start()
{
//This is where you register your concrete types with StructureMap
Bootstrapper.ConfigureStructureMap();
//Our very own Controller Factory
ControllerBuilder.Current.SetControllerFactory
(new StructureMapControllerFactory());
RegisterRoutes(RouteTable.Routes);
}
在StructureMapControllerFactory,我們稱之爲ObjectFactory.GetInstance來回報您對我們的控制器(提供我們連線了我們所有的依賴)
public class StructureMapControllerFactory : DefaultControllerFactory
{
protected override IController GetControllerInstance(Type controllerType)
{
if (controllerType == null) return null;
try
{
return ObjectFactory.GetInstance(controllerType) as Controller;
}
catch (StructureMapException)
{
System.Diagnostics.Debug.WriteLine(ObjectFactory.WhatDoIHave());
throw;
}
}
}
希望我的解釋是明確的,但讓我知道,如果它不是,我可以擴展它。
順便說一句,下面的代碼片段是關於您的引導程序代碼的樣子的例子。
public static class Bootstrapper
{
public static void ConfigureStructureMap()
{
ObjectFactory.Initialize(
x => x.AddRegistry(new MyApplicationRegistry()));
}
}
public class MyApplicationRegistry : Registry
{
public MyApplicationRegistry()
{
ForRequestedType<ISomeService>()
.CacheBy(InstanceScope.Your_Choice_Here)
.TheDefault.Is.OfConcreteType<SomeService>();
}
}
注意:請參閱StructureMap doc以瞭解各種InstanceScope選項。
感謝的人!構造器注入+生命週期管理=這是我需要的 – IlliakaillI 2010-03-05 14:03:28