加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – ASP.NET MVC和Unity 1.2容器问题

发布时间:2020-12-15 19:25:14 所属栏目:asp.Net 来源:网络整理
导读:我试图使用Unity容器来更容易地对我的控制器进行单元测试.我的控制器使用一个接受Repository接口的构造函数.在global.asax文件中,我实例化一个UnityContainerFactory并将其注册到MVC框架中,然后注册存储库及其实现.我将[Dependency]属性添加到控制器的CTOR R
我试图使用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#
Test.DLL!Test._Default.Page_Load(object sender = {ASP.default_aspx},System.EventArgs e = {System.EventArgs})行18 0x1a bytes 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以查看路由中没有哪个文件.很多时候,这不是你要控制的东西,但它会让你更好地了解请求的来源.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读