Unity IoC и MVC 3 Beta - передача IRepository в конструктор контроллера - PullRequest
2 голосов
/ 15 октября 2010

Что-то изменилось в 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));

Ответы [ 2 ]

3 голосов
/ 23 ноября 2010

Это сработало для меня для MVC3 RC.Обратите внимание, что IControllerFactory теперь имеет GetControllerSessionBehavior в MVC3 RC.

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)
      );
    }
  }
2 голосов
/ 15 октября 2010

Чтобы ответить на ваш вопрос «Что изменилось в MVC3»: MVC3 теперь имеет встроенную поддержку внедрения зависимостей.Вместе с этим изменением произошел редизайн способа активации объектов контроллера.Посмотрите статью Брэда Уилсона (и всю серию о MVC 3.0) для получения дополнительной информации:

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

Разработчики, которые ранее реализовали IControllerFactory, наследуя метод DefaultControllerFactory, просто переопределяя метод GetControllerInstance для зависимостиВ целях инъекции теперь следует использовать IControllerActivator.

Короче говоря, фабрика контроллеров Unity (а также фабрика контроллеров Ninject), вероятно, будут разрушены, пока не выпустят новую совместимую версию.Быстрый Google нашел это , однако я понятия не имею, работает ли он.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...