在我正在处理的当前应用程序中,我有一个自定义ControllerFactory类,它创建一个控制器并自动设置Elmah ErrorHandler。
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在我的控制器中注入一些代码。例如,我想在其中自动注入存储库类。
我已经创建了我的存储库类,并且我已经向接收存储库类的控制器添加了一个构造函数
public FirmController( IContactRepository contactRepository ) {
_contactRepository = contactRepository;
}
然后我在StructureMap中注册了类型
ObjectFactory.Initialize( x => {
x.For<IContactRepository>().Use<MyContactRepository>();
});
我应该如何更改CreateController方法中的代码,以便在IContactRepository
中注入FirmController
具体类?
修改:
我已将BaseControllerFactory更改为使用Structuremap。但我在线上得到了一个例外
return (Controller)ObjectFactory.GetInstance( controllerType );
任何提示?
答案 0 :(得分:5)
在输入解决方案之前,我建议使用Container类型初始化SM而不是ObjectFactory
实现此目标的最佳方法是从StructureMap框架中的Registry类创建一个子类。所以,我的注册表就像是
public class MyAppRegistry : Registry
{
public MyAppRegistry()
{
For<IContactRepository>().Use<MyContactRepository>();
}
}
然后告诉SM在配置期间使用此注册表。
var container = new Container(x=>x.AddRegistry(new MyAppRegistry());
这可以从Global.asax中的Application_Start完成。在上面的行之后,在mvc中设置ControllerBuilder以使用BaseControllerFactory。现在SM应该能够解决所有依赖关系