我一直在玩几个 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 控制器的错误快照。
带有参数的控制器的错误消息也是相同的。最终结果是没有控制器被实例化。
谢谢蒂姆