asp.net-mvc – ASP.NET MVC和Unity 1.2容器问题
我试图使用Unity容器来更容易地对我的控制器进行单元测试.我的控制器使用一个接受Repository接口的构造函数.在global.asax文件中,我实例化一个UnityContainerFactory并将其注册到MVC框架中,然后注册存储库及其实现.我将[Dependency]属性添加到控制器的CTOR Repository参数.这一切似乎都可以正常工作,除了偶尔工厂的GetControllerInstance(类型controllerType)被多次调用,并且作为controllerType传递一个空参数.
对工厂的第一次调用是正确的,controllerType“ProductsController”作为参数传入.但有时候,工厂被称为几次,视图被显示为一个空值为控制器,我不知道为什么.当控制器类型的正确值通过“调用堆栈”对我有意义,但是当通过null时,我不知道为什么或正在进行调用.有任何想法吗? 示例的代码和调用堆栈如下所示. 调用堆栈时工作 Test.DLL!Test.UnityHelpers.UnityControllerFactory.GetControllerInstance(System.Type controllerType = {Name =“ProductsController”FullName =“Test.Controllers.ProductsController”})行23 C# 在controllerType传递NULL时调用堆栈 Test.DLL!Test.UnityHelpers.UnityControllerFactory.GetControllerInstance(System.Type controllerType = null)第27行C# 首先我创建了一个UnityControllerFactory public class UnityControllerFactory : DefaultControllerFactory { UnityContainer container; public UnityControllerFactory(UnityContainer container) { this.container = container; } protected override IController GetControllerInstance(Type controllerType) { if (controllerType != null) { return container.Resolve(controllerType) as IController; } else { return null; // I never expect to get here,but I do sometimes,the callstack does not show the caller } } } 接下来,我添加了以下代码global.asax文件来实例化容器工厂 protected void Application_Start() { RegisterRoutes(RouteTable.Routes); // Create Unity Container if needed if (_container == null) { _container = new UnityContainer(); } // Instantiate a new factory IControllerFactory unityControllerFactory = new UnityControllerFactory(_container); // Register it with the MVC framework ControllerBuilder.Current.SetControllerFactory(unityControllerFactory); // Register the SqlProductRepository _container.RegisterType<IProductsRepository,SqlProductRepository> (new ContainerControlledLifetimeManager()); } 该应用程序有一个控制器 public class ProductsController : Controller { public IProductsRepository productsRepository; public ProductsController([Dependency]IProductsRepository productsRepository) { this.productsRepository = productsRepository; } } 解决方法
这可能是由于某些文件类型不映射到路由中的控制器. (例如图像).当我在经验中使用Cassini进行本地调试时,这将会更频繁地发生,因为Cassini允许所有请求通过ASP.NET进行路由,而在IIS中IIS的许多请求都由IIS处理.这也是为什么你没有看到您的代码在堆栈中的请求.如果您在Visual Studio中关闭“Just My Code”选项,您有时可以更好地了解这些内容.
但这并不是唯一可能发生的原因,但它是常见的. 适当的做法是在这些情况下允许base方法处理请求.它通常只是一个简单的文件请求,不应该对您有任何影响. 最简单的事情就是把它当成这样: if (controllerType != null) { return container.Resolve(controllerType) as IController; } else { return base.GetControllerInstance(requestContext,controllerType); } 应该这样做 要查看请求是什么,您可以检查HttpContext.Current.Request以查看路由中没有哪个文件.很多时候,这不是你要控制的东西,但它会让你更好地了解请求的来源. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc-3 – 如何在MVC应用程序中使用POCO
- asp.net – 如何添加一个模板到一个UserControl?
- asp.net-mvc – 如何在mvc4中的特定视图中添加单个css文件?
- asp.net-mvc – ASP.NET MVC3自定义不显眼的客户端验证不会
- asp.net-mvc – 设置debug = false实际导致远程SLOWER渲染?
- asp.net – 无法为Elmah配置邮件
- asp.net – 无法打开登录请求的数据库.登录失败.用户登录失
- ASP.NET MVC强类型视图编译错误
- asp.net – 发送多个模型以查看MVC 4
- asp.net – 对象不是垃圾回收,但不包含gcroot
- 在ASP.Net动态数据中使用Computed Property作为D
- asp.net-core – 如何从Microsoft.NetCore.App 2
- asp.net-mvc-3 – MVC:路由获取/发布到不同的控
- ASP.NET MVC – 用于编辑的ViewModels
- asp.net – 引用和外部类使用问题
- 如何让ASP.NET Web API的Action方法在希望的Cult
- ASP.NET Web Service中XML文档中的非法字符
- 将我的思维模式从ASP.NET迁移到ASP.NET MVC(2)时
- asp.net – 异步HTTP处理程序和在后台线程中使用
- ASP.net WebForms – 构造函数与Page_Load