MVC 3 бета + Зависимость Resolver + Unity = есть проблема - PullRequest
5 голосов
/ 28 ноября 2010

Я пытался использовать Dependency Resolver с Unity, и у меня возникли проблемы при создании моего контроллера. Вот пример контроллера:

public class AccountController : Controller
{
    private readonly ICourseService _courseService;

    public AccountController(ICourseService courseService)
    {
         _courseService = courseService;
    }
}

Но, когда контроллер пытается создать - я получил исключение: «Для этого объекта не определен конструктор без параметров». Я даже пытаюсь добавить конструктор по умолчанию для этого контроллера, но courseService не создал. Также попробуйте добавить свойство с атрибутом [Dependency] - ничего не произошло. Вот класс Решения зависимостей:

public class UnityDependencyResolver : IDependencyResolver
{
    private readonly IUnityContainer _container;
    public UnityDependencyResolver(IUnityContainer container)
    {
        _container = container;
    }

    public object GetService(Type serviceType)
    {
        return _container.IsRegistered(serviceType) ? _container.Resolve(serviceType) : null;
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        return _container.IsRegistered(serviceType) ? _container.ResolveAll(serviceType) : new List<object>();
    }
}

и Global.asax.cs:

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

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

        var container = new UnityContainer();
        container.RegisterType<ICourseService, CourseService>();

        DependencyResolver.SetResolver(new UnityDependencyResolver(container));
    }

Кто-нибудь может мне помочь?

Ответы [ 4 ]

5 голосов
/ 28 октября 2011

Старый пост, но остальные ответы неверны.У меня была эта проблема сегодня, и вам определенно не нужно регистрировать контроллеры или фабрику контроллеров.Это сообщение просто означает, что что-то в иерархии зависимостей для контроллера не зарегистрировано.Например, если ваш контроллер требует IService в своем конструкторе, а IService требует IRepository в своем конструкторе, но вы забыли зарегистрировать IRepository, вы получите эту ошибку.

2 голосов
/ 28 ноября 2010

Ваша реализация IDependencyResolver требует, чтобы AccountController был зарегистрирован.Попробуйте добавить эту регистрацию, иначе она вернет ноль, и MVC попытается создать контроллер с активатором, для которого требуется ctor без параметров.

1 голос
/ 17 января 2012

Код выше сломается, если ваши контроллеры будут зависеть от не зарегистрированных типов, которые являются конкретными.Вам следует изменить GetService () следующим образом:

 public object GetService(Type serviceType){
    if (!container.IsRegistered(serviceType)){
      if (serviceType.IsAbstract || serviceType.IsInterface){
        return null;
      }
    }
    return container.Resolve(serviceType);
  }

Таким образом, если, скажем, CourseService зависит от конкретного CourseRepository, контейнер его создаст.

Я с DanH в предположении, что где-то в иерархии есть пропущенная регистрация типа или зависимость от конкретного типа, который не становится закрепленным.

У меня была такая же проблема, и я нашел следующую статью полезной:

http://xhalent.wordpress.com/2011/01/17/using-unity-as-a-dependency-resolver-asp-net-mvc-3/

0 голосов
/ 07 декабря 2010

Ваша проблема в том, что MVC все еще пытается создать экземпляр контроллера с фабрикой контроллеров по умолчанию, которая требует конструктора без параметров и не знает вашего контейнера Unity или как разрешить зависимость ICourseService.

Вам нужно создать собственную фабрику контроллеров, чтобы использовать преимущества Unity (особенно тот, который переопределяет GetControllerInstance(Type type) - для этого должно быть много документации и примеров; это простой класс - и затем зарегистрируйте его в Application_Start следующим образом:

ControllerBuilder.Current.SetControllerFactory (new MyUnityControllerFactory(container));
...