我一直在玩几个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控制器的错误快照,它没有构造函数参数。
对于带参数的控制器,错误消息也是相同的。最终结果是没有控制器被实例化。
由于 添
答案 0 :(得分:1)
使用合适的依赖注入容器,您不必创建自己的IControllerBuilder。 您只需要注册TinyIoCResolver(IDependencyResolver),ASP.NET MVC将完成剩下的工作。