How to use StructureMap to inject repository classes to the controller?
在我正在处理的当前应用程序中,我有一个自定义的ControllerFactory类,它创建一个控制器并自动设置Elmah错误处理程序。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | public class BaseControllerFactory : DefaultControllerFactory { public override IController CreateController( RequestContext requestContext, string controllerName ) { var controller = base.CreateController( requestContext, controllerName ); var c = controller as Controller; if ( c != null ) { c.ActionInvoker = new ErrorHandlingActionInvoker( new HandleErrorWithElmahAttribute() ); } return controller; } protected override IController GetControllerInstance( RequestContext requestContext, Type controllerType ) { try { if ( ( requestContext == null ) || ( controllerType == null ) ) return base.GetControllerInstance( requestContext, controllerType ); return (Controller)ObjectFactory.GetInstance( controllerType ); } catch ( StructureMapException ) { System.Diagnostics.Debug.WriteLine( ObjectFactory.WhatDoIHave() ); throw new Exception( ObjectFactory.WhatDoIHave() ); } } } |
我想使用structuremap在我的控制器中插入一些代码。例如,我想在其中自动插入存储库类。
我已经创建了我的知识库类,还向接收知识库类的控制器添加了一个构造函数。
1 2 3 | public FirmController( IContactRepository contactRepository ) { _contactRepository = contactRepository; } |
然后我在structuremap中注册了类型
1 2 3 | ObjectFactory.Initialize( x => { x.For<IContactRepository>().Use<MyContactRepository>(); }); |
我应该如何更改createController方法中的代码,使
编辑:
我已将BaseControllerFactory更改为使用结构图。但我在电话里有个例外
1 | return (Controller)ObjectFactory.GetInstance( controllerType ); |
有什么暗示吗?
在输入解决方案之前,我建议使用容器类型来初始化sm,而不是objectfactory
实现这一点的最佳方法是在structuremap框架中从注册表类中创建一个子类。所以,我的注册表应该是
1 2 3 4 5 6 7 | public class MyAppRegistry : Registry { public MyAppRegistry() { For<IContactRepository>().Use<MyContactRepository>(); } } |
然后告诉sm在配置期间使用这个注册表。
1 | var container = new Container(x=>x.AddRegistry(new MyAppRegistry()); |
这将从global.asax中的应用程序_start完成。在上述行之后,在MVC中设置ControllerBuilder以使用BaseControllerFactory。现在,SM应该能够解决所有依赖关系