2

MVC 3で何か変更がありましたか?UnityをIoCコンテナとして設定するためにインターネット上のすべての例を試しましたが、UnityがUserControllerを解決できないというエラーが表示され続けます。UserControllerのコンストラクターは次のとおりです。

public UserController(IUserService userService)
{
    _userService = userService;
}

IUserServiceを登録しましたが、問題ありません。どんな例を試しても、エラーが発生し続けます。Asp.Net MVC 3で動作する優れたチュートリアルまたはコードを持っている人はいますか?

参考までに、これ、これ、これ、これ、そしてこれを試してみまし...そしてたくさんあります。

エラー:

The type UserController cannot be constructed.  You must configure the container to supply this value.

ErrorLine:

controller = MvcUnityContainer.Container.Resolve(controllerType) as IController;

構成:

MvcUnityContainer.Container = new UnityContainer().RegisterType<IUserService, UserService>();

ControllerBuilder.Current.SetControllerFactory(typeof(UnityControllerFactory));
4

2 に答える 2

3

これはMVC3RCでうまくいきました。IControllerFactoryのMVC3RCにGetControllerSessionBehaviorがあることに注意してください。

UnityMvcControllerFactory.cs:

using System;
using System.Web.Mvc;
using System.Web.Routing;
using Microsoft.Practices.Unity;
using System.Web.SessionState;

public class UnityMvcControllerFactory : IControllerFactory
{
  private IUnityContainer _container;
  private IControllerFactory _innerFactory;

  public UnityMvcControllerFactory(IUnityContainer container)
    : this(container, new DefaultControllerFactory())
  {
  }

  protected UnityMvcControllerFactory(IUnityContainer container,
                                   IControllerFactory innerFactory)
  {
    _container = container;
    _innerFactory = innerFactory;
  }

  public IController CreateController(RequestContext requestContext, string controllerName)
  {
    try
    {
      return _container.Resolve<IController>(controllerName.ToLowerInvariant());
    }
    catch (Exception)
    {
      return _innerFactory.CreateController(requestContext, controllerName);
    }
  }

  public void ReleaseController(IController controller)
  {
    _container.Teardown(controller);
  }

  public SessionStateBehavior GetControllerSessionBehavior(RequestContext requestContext, string controllerName)
  {
    return SessionStateBehavior.Default;
  }
}

Global.asax.cs:

  public class MvcApplication : System.Web.HttpApplication
  {
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
      filters.Add(new HandleErrorAttribute());
    }

    public static void RegisterRoutes(RouteCollection routes)
    {
      routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

      routes.MapRoute(
          "Default", // Route name
          "{controller}/{action}/{id}", // URL with parameters
          new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
      );
    }

    protected void Application_Start()
    {
      // Register Types and Set Controller Factory 
      ConfigureUnityContainer();

      AreaRegistration.RegisterAllAreas();

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

    private static void ConfigureUnityContainer()
    {
      IUnityContainer container = new UnityContainer();

      // Set Controller Factory as UnityMvcControllerFactory
      ControllerBuilder.Current.SetControllerFactory(
          new UnityMvcControllerFactory(container)
      );
    }
  }
于 2010-11-23T16:44:26.760 に答える
2

「MVC3で何が変更されたか」という質問に答えるために:MVC3は、依存性注入をネイティブでサポートするようになりました。その変更に伴い、コントローラーオブジェクトをアクティブ化する方法が再設計されました。詳細については、Brad Wilsonの投稿(およびMVC 3.0に関するシリーズ全体)を確認してください。

http://bradwilson.typepad.com/blog/2010/10/service-location-pt10-controller-activator.html

依存性注入の目的でGetControllerInstanceメソッドをオーバーライドするためだけにDefaultControllerFactoryから派生して以前にIControllerFactoryを実装していた開発者は、代わりにIControllerActivatorを実装する必要があります。

つまり、ユニティコントローラーファクトリ(およびNinjectコントローラーファクトリ)は、互換性のある新しいバージョンがリリースされるまで、おそらく壊れてしまうでしょう。クイックグーグルはこれを見つけました、しかし私はそれがうまくいくかどうかわかりません。

于 2010-10-15T17:38:41.023 に答える