【问题标题】:Profile ninject in mvc3 web application在 mvc3 Web 应用程序中配置 ninject
【发布时间】:2012-04-03 15:11:19
【问题描述】:

我正在使用 Ninject 和 MVC3 来注入我的控制器依赖项。有时,即使在执行控制器操作之前,我也会在 MVC Mini Profiler 中获得缓慢的计时。由于在那之前我没有做太多事情,我认为这可能是我使用 Ninject 的问题。是否有现有的方法可以从 ninject 获取一些时间信息?也许是一个配置选项来记录依赖解析花费了多长时间,或者如果不是我自己添加它的好方法,是否有一个我可以扩展或包装的类?

【问题讨论】:

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


    【解决方案1】:

    您可以通过实现 IDependencyResolver 接口为 NinjectDependencyResolver 编写一个装饰器,并在 DependencyResolver 上替换它。

    DependencyResolver.SetResolver(new ProfilingResolver(DependencyResolver.Current));
    
    public class ProfilingResolver : IDependencyResolver
    {
        private readonly IDependencyResolver decoratedResolver;
    
        public ProfilingResolver(IDependencyResolver decoratedResolver)
        {
            this.decoratedResolver = decoratedResolver;
        }
    
        public object GetService(Type serviceType)
        {
            using (MiniProfiler.Current.Step("Get_" + serviceType.Name))
            {
                return this.decoratedResolver.GetService(serviceType);
            }
        }
    
        public IEnumerable<object> GetServices(Type serviceType)
        {
            using (MiniProfiler.Current.Step("GetAll_" + serviceType.Name))
            {
                return this.decoratedResolver.GetServices(serviceType);
            }
        }
    }
    

    【讨论】:

    • 供将来参考,它确实不是ninject!
    【解决方案2】:

    首先,我的默认答案是:-

    我从未见过 DI 在个人资料中任何有趣的内容中占统计显着的百分比。 Go Compose!

    (这篇文章最初是作为评论开始的:-@olle 你看过源吗?有一些相对简单的扩展可以“包装”解决过程,不应该太复杂而无法理解。鉴于你正在使用Mini Profiler 并且很容易将内容塞入其中,这似乎是一个相对简单的扩展。我知道这是 PITA 对论坛的回应,但我个人很感谢被告知去使用源几年前 - Ninject 代码库和它的测试是真正的阅读乐趣。)

    【讨论】:

    • 不,我非常感谢这个答案。我查看了源代码,我还想检查是否已经存在我可能错过的包装器/功能等。
    • @olle 酷。很高兴有一个雷莫来给出真正的答案:D
    最近更新 更多