MVC3是否曾使用IDependancyResolver寻找ITempDataPovider的实现?

时间:2011-03-16 21:49:00

标签: asp.net-mvc asp.net-mvc-3

这是一个非常直截了当的问题。我希望能够使用TempData向用户提供有关回发结果的反馈(因为它已自动清除)。在成功执行接受回发的操作后,我转发到专用于显示操作结果的视图,并希望使用TempData但禁用SessionState。目前,MVC3 Futures中包含的CookieTempDataProvider效果很好,但似乎我的IDependancyResolver实现似乎并未调用任何实现ITempDataPovider的内容。

这是疏忽吗?

其他人试过这个吗?

2 个答案:

答案 0 :(得分:4)

您可以通过创建IDependancyResolver

请求的新controllerfactory来完成此操作
/// <summary>
///   <para>Controller Factory</para>
/// </summary>
public class MyControllerFactory : DefaultControllerFactory {

    /// <summary>
    /// <para>Get instance of the controller</para>
    /// </summary>
    protected override IController GetControllerInstance(
            RequestContext requestContext, Type controllerType) {
        var controller = base.GetControllerInstance(requestContext, controllerType);

        if (controller != null
                && typeof(Controller).IsAssignableFrom(controller.GetType())) {
            // ITempDataProvider
            var tempDataProvider = DependencyResolver.Current
                                       .GetService<ITempDataProvider>();
            if (tempDataProvider != null)
                ((Controller) controller).TempDataProvider = tempDataProvider;
        }

        return controller;
    }
}

然后在您的依赖解析器中设置它以查找IControllerFactory,并返回您的ITempDataProvider

ninject的例子:

_kernel.Bind<IControllerFactory>()
            .To<MyControllerFactory>().InSingletonScope();
_kernel.Bind<ITempDataProvider>()
            .ToMethod(c => new CookieTempDataProvider(HttpContext.Current))
            .InRequestScope();

答案 1 :(得分:1)

不使用Depenency注入来查找MVC 3中ITempDataProvider的实例。在MVC 3中完成的DI工作旨在揭示最常请求的DI似乎。

自定义ITempDataProvider实例的唯一方法是覆盖Controller.CreateTempDataProvider方法。