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 – 什么是防伪令牌盐的使用?
- asp.net-mvc – 如何获取Azure网站上的错误详细信息
- asp.net-mvc – 单元测试视图?
- asp.net-mvc – 如何在Ajax窗体的asp.net mvc中提交下拉列表
- asp.net-mvc – 如何在asp.net mvc 3中使用@html.actionlin
- asp.net-mvc – ASP.NET成员资格替代方案
- ASP.Net:如何从内容页面事件处理程序调用主页面事件处理程
- asp.net – 如何以编程方式触发dropdownlist.selectedindex
- 在IIS 8上发布asp vnext网站的问题
- asp.net-core – 如何在Asp.net Core中检测会话超时?
- Asp.net Webform显示警报和重定向
- ASP.NET 5 API – Azure AD B2C
- asp.net – GridView’GridView1’触发的事件Pag
- asp.net – 如何从System.Web.HttpPostedFileBas
- asp.net-mvc – SignalR – 使用Windows和匿名身
- .net – SqlConnection的Dispose方法是否会干扰连
- asp.net-mvc – 使用REST API进行身份验证
- asp.net-mvc – 如何从mvc中的控制器中设置隐藏字
- asp.net – 如何使用EF仅更新单个字段
- asp.net-mvc – IIS显示服务器错误而不是自定义错
