关于asp.net mvc:如何使用StructureMap将存储库类注入控制器?

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方法中的代码,使IContactRepository具体类注入到FirmController中?

编辑:

我已将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应该能够解决所有依赖关系