Создание фабрики контроллеров MVC для TinyIoC, учитывающей аргументы конструктора

Я играл с парой DI-контейнеров, и мне нравится TinyIoC. Впервые я познакомился с ним через Nancy/fx.

Я пытаюсь использовать его в текущем проекте MVC, но не могу заставить его создавать экземпляры контроллеров, которые содержат параметры интерфейса в конструкторе.

Насколько я понимаю, это должно быть прямолинейно. Он даже поставляется с методом AutoRegister, который обеспечивает базовую регистрацию. Я реализовал IControllerFactory, который позволяет мне переопределить DefaultControllerFactory для MVC, который просто создает экземпляры контроллеров, кстати, он не выполняет и DI.

Я также реализовал IDependancyResolver для использования TinyIoC. Но создание экземпляров контроллеров не работает. У вас есть пример кода, который я вижу, который иллюстрирует, как использовать его для создания экземпляров контроллеров с помощью TinyIoC?

Вот что у меня есть до сих пор.

КонтроллерЗаводской код

public class TinyIoCControllerFactory : IControllerFactory
    {
        private readonly TinyIoCContainer _container;

        public TinyIoCControllerFactory(TinyIoCContainer container)
        {
            _container = container;
        }

        public IController CreateController(RequestContext requestContext, string controllerName)
        {
            return (_container.CanResolve<IController>(controllerName))
                ? _container.Resolve<IController>(controllerName)
                : null;
        }

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

        public void ReleaseController(IController controller)
        {
            var disposeable = (IDisposable) controller;

            if (disposeable == null) return;

            disposeable.Dispose();
        }
    }

Код DependencyResolver

public class TinyIoCResolver : IDependencyResolver
    {
        private readonly TinyIoCContainer _container;

        public TinyIoCResolver(TinyIoCContainer container)
        {
            _container = container;
        }

        public object GetService(Type serviceType)
        {
            return _container.Resolve(serviceType);
        }

        public IEnumerable<object> GetServices(Type serviceType)
        {
            return _container.ResolveAll(serviceType, true);
        }
    }

Регистрационный код

public static void RegisterContainer(TinyIoCContainer container)
{            
            ControllerInstaller.Install(container);            
            RepositoryInstaller.Install(container);

            container.Register<IControllerFactory>(new TinyIoCControllerFactory(container));
            DependencyResolver.SetResolver(new TinyIoCResolver(container));
}

public static void Install(TinyIoCContainer container)
{
            container.Register<ISomeDBContext, SomeDbContext>();
            container.Register<ISomeRepository, SomeRepository>();
}

public static void Install(TinyIoCContainer container)
{            
            container.Register<IController, HomeController>();
            container.Register<IController, TestController>();
}

Нужно ли использовать метод UsingConstructor() для принудительного создания экземпляра? Если да, то как мне его использовать?

Вот снимок ошибки только для домашнего контроллера, у которого нет параметров конструктора.

Вот ошибка

Сообщение об ошибке одинаково для контроллеров с аргументами. Конечным результатом является то, что контроллеры не создаются.

Спасибо, Тим.


person user953710    schedule 10.08.2014    source источник


Ответы (1)


С приличным контейнером внедрения зависимостей вам не нужно создавать свой собственный IControllerBuilder. Вам нужно только зарегистрировать свой TinyIoCResolver (IDependencyResolver), а ASP.NET MVC сделает все остальное.

person Peter Kiss    schedule 10.08.2014
comment
Я удалил код ControllerBuilder и оставил код регистрации DependancyResolver, и это сработало. Спасибо - person user953710; 10.08.2014