1

コントローラーのパラメーターなしのコンストラクターの問題があります。それを解決するために、StructureMap を使用します。

このクラスを追加します

public class StructureMapControllerFactory : DefaultControllerFactory
{
    public override IController CreateController(RequestContext requestContext, string controllerName)
    {
        try
        {
            string key = controllerName.ToLowerInvariant();
            return ObjectFactory.GetNamedInstance<IController>(key);
        }
        catch (StructureMapException ex)
        {
            //Use the default logic.
            return base.CreateController(requestContext, controllerName);
        }
    }
}

そして、私は付け加えます

ControllerBuilder.Current.SetControllerFactory(new StructureMapControllerFactory());

Global.asax.cs の Application_Start() に

しかし、おそらく StructureMap を初期化していないため、エラーが発生しました ControllerFactory のみを使用するためにこれを適切に初期化するにはどうすればよいですか?

4

1 に答える 1

1

依存関係をどこかに登録する必要があります。これを行うにはいくつかの方法があり、構造マップのドキュメントで読むことができます。

プロジェクト サイトによると、StructureMap.MVC3 という名前の NuGet パッケージもあります。私はそれを自分でテストしていません。

これは、コントローラーが 1 つある Web サイトの単純な例です。

コントローラ

public class MyController : Controller
{
    private readonly IRepository repository;

    public MyController(IRepository repository)
    {
        this.repository = repository;
    }

    public ActionResult Index()
    {
        ViewBag.Message = repository.GetData();

        return View();
    }
}

Global.asax

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();

    ObjectFactory.Initialize(a => a.For<IRepository>().Use<Repository>());
    ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory());

    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);
}

私のControllerFactoryで

protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
{
    return (Controller)ObjectFactory.GetInstance(controllerType);
}

StructureMap の構成

StructureMap.MVC3

于 2012-07-27T17:21:58.720 に答える