0

我一直在玩几个 DI 容器,我喜欢 TinyIoC。我是通过 Nancy/fx 第一次被介绍给它的。

我正在尝试在当前的 MVC 项目中使用它,但似乎无法让它实例化包含构造函数中的接口参数的控制器。

据我了解,它应该是直截了当的。它甚至带有一个 AutoRegister 方法来处理基本注册。我已经实现了 IControllerFactory,它允许我覆盖 MVC 的 DefaultControllerFactory,它只是实例化控制器,顺便说一句,它不执行和 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();
        }
    }

依赖解析器代码

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() 方法来强制实例化?如果是这样,我该如何使用它?

这是没有构造函数参数的 Home 控制器的错误快照。

这是错误

带有参数的控制器的错误消息也是相同的。最终结果是没有控制器被实例化。

谢谢蒂姆

4

1 回答 1

1

使用一个不错的依赖注入容器,您不必创建自己的 IControllerBuilder。您只需要注册您的 TinyIoCResolver (IDependencyResolver),其余的将由 ASP.NET MVC 完成。

于 2014-08-10T16:12:38.490 回答