ASP.Net MVC Controller需要很长时间才能初始化其构造函数

时间:2017-03-07 10:23:28

标签: asp.net-mvc dependency-injection inversion-of-control castle-windsor

我使用Castle Windsor作为IOC进行依赖注入。但是,无论我在控制器类的构造函数中注入少量应用程序服务,并且如果任何这些应用程序服务的构造函数都注入了许多项,那么执行控制器操作需要很长时间(长达20秒)。

你能帮忙并在这里建议一些强有力的解决方案吗?

提前致谢!

更新 我们在其中一个应用程序服务的构造函数中注入了20个存储库和15个应用程序服务。让我举个例子来说清楚:

我有3个应用程序服务,比如A,B和C.在这里, C的构造函数在其构造函数中注入了25个项目(20个存储库和5个应用程序服务) B的构造函数在其构造函数中注入了35个项目(25个存储库和10个应用程序服务 - 其中一个是C) A的构造函数有35个项目(20个存储库和15个应用程序服务 - 其中两个是B和C)注入其构造函数

因此,C的构造函数被初始化3次(实际上是5次)。这种级联效应导致了这个问题。至少,这就是我的想法。

对此有何建议?

2 个答案:

答案 0 :(得分:1)

控制器初始化变慢的原因之一可能是当您有很多依赖项时,这些依赖项又将依赖项注入到其构造函数中,依此类推。

我在使用Simple Injector遇到此问题。因此,对我有用的解决方案是在某些情况下将Lifestyle更改为Singleton。

对于温莎城堡,您可能需要查看他们的文档并找到等效文件。

答案 1 :(得分:0)

可能一些(全部?)构造函数不仅仅将注入的组件分配给私有字段。

此外,注入了20个存储库 - 看起来有点过分。您是否考虑使用typed factory facility,因此只注入存储库工厂,并根据需要使用它来解析各个存储库?

public class MyService : IMyService
{
   publiv coid MyService(IRepositoryFactory repoFactory)
   {
       _repoFactory = repoFactory;
   }

   public void SomeMethod(string id)
   {
      var imageRepository = _repoFactory.Get<IImageRepository>(); //or IRepository<Image>() - depends on how your repos are structured
      var image = imageRepository.Get(id);
   }
}

如果可以以某种方式统一服务,可以说同样的服务。