为TinyIoC创建一个考虑构造函数参数的MVC控制器工厂

时间:2014-08-10 14:46:16

标签: c# asp.net-mvc asp.net-mvc-4 tinyioc

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

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

据我所知,它应该是直截了当的。它甚至附带一个AutoRegister方法来处理基本注册。我已经实现了IControllerFactory,它允许我覆盖MVC的DefaultControllerFactory,它简单地实例化控制器,BTW,它不执行和DI。

我还实施了IDependancyResolver以利用TinyIoC。但实例化控制器不起作用。您是否有可以看到的示例代码,说明如何使用它来使用TinyIoC实例化控制器?

这是我到目前为止所拥有的。

ControllerFactory Code

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 Code

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控制器的错误快照,它没有构造函数参数。

Here is the error

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

由于 添

1 个答案:

答案 0 :(得分:1)

使用合适的依赖注入容器,您不必创建自己的IControllerBuilder。 您只需要注册TinyIoCResolver(IDependencyResolver),ASP.NET MVC将完成剩下的工作。