2012-07-24 37 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