如何使用StructureMap将存储库类注入控制器?

Lor*_*nzo 1 structuremap asp.net-mvc dependency-injection repository-pattern asp.net-mvc-3

在我正在处理的当前应用程序中,我有一个自定义的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() );
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我想使用StructureMap在我的控制器中注入一些代码.例如,我想在其中自动注入存储库类.

我已经创建了我的存储库类,并且我已经向接收存储库类的控制器添加了一个构造函数

public FirmController( IContactRepository contactRepository ) {
    _contactRepository = contactRepository;
}
Run Code Online (Sandbox Code Playgroud)

然后我在StructureMap中注册了类型

ObjectFactory.Initialize( x => {
    x.For<IContactRepository>().Use<MyContactRepository>();
});
Run Code Online (Sandbox Code Playgroud)

我应该如何更改CreateController方法中的代码以将IContactRepository具体类注入FirmController

编辑:

我已将BaseControllerFactory更改为使用Structuremap.但是我在线上有例外

return (Controller)ObjectFactory.GetInstance( controllerType );
Run Code Online (Sandbox Code Playgroud)

任何提示?

小智 5

在输入解决方案之前,我建议使用Container类型来初始化SM而不是ObjectFactory

实现此目标的最佳方法是从StructureMap框架中的Registry类创建一个子类.所以,我的注册表就像是

public class MyAppRegistry : Registry
{
     public MyAppRegistry()
     {
        For<IContactRepository>().Use<MyContactRepository>();
     }
}
Run Code Online (Sandbox Code Playgroud)

然后告诉SM在配置期间使用此注册表.

var container = new Container(x=>x.AddRegistry(new MyAppRegistry());
Run Code Online (Sandbox Code Playgroud)

这将通过Global.asax中的Application_Start完成.在上面的行之后,在mvc中设置ControllerBuilder以使用BaseControllerFactory.现在SM应该能够解决所有依赖关系