簡體   English   中英

如何使用StructureMap將存儲庫類注入控制器?

[英]How to use StructureMap to inject repository classes to the controller?

在當前應用程序中,我正在使用一個自定義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 );

有什么提示嗎?

在輸入解決方案之前,我建議使用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應該能夠解決所有依賴性

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM