由于Unity已被弃用,我最近将一个.NET Framework 4.7.2 MVC项目从Unity迁移到了Microsoft.Extensions.DependencyInjection。转换似乎很简单,主要变化是需要创建自定义的DependencyResolver
,因为这之前都是由Unity来处理的。
现在这些更改已经在生产环境上实施,我开始注意到一些严重的内存问题。获取内存使用情况的转储显示,Microsoft.Extensions.DependencyInjection
中的ServiceProvider
是内存中占用最大的项,其中包含数千个未被处理的控制器。
DependencyResolver
如下:
public class MicrosoftDefaultDependencyResolver
: System.Web.Mvc.IDependencyResolver
, System.Web.Http.Dependencies.IDependencyResolver
{
protected IServiceProvider serviceProvider;
public MicrosoftDefaultDependencyResolver(IServiceProvider serviceProvider)
{
this.serviceProvider = serviceProvider;
}
public IDependencyScope BeginScope()
{
return new MicrosoftDefaultDependencyResolver(
this.serviceProvider.CreateScope().ServiceProvider);
}
public void Dispose()
{
}
public object GetService(Type serviceType)
{
return this.serviceProvider.GetService(serviceType);
}
public IEnumerable<object> GetServices(Type serviceType)
{
return this.serviceProvider.GetServices(serviceType);
}
}
我已经根据我读过的stackoverflow文章进行了实现:如何在使用Microsoft.Extensions.DependencyInjection的.NET框架中注入WebAPI依赖项? Startup类看起来像这样:
public void Configuration(IAppBuilder app)
{
// Set MVC Resolver
MicrosoftDefaultDependencyResolver resolver = GetDependencyResolver();
DependencyResolver.SetResolver(resolver);
// Any connection or hub wire up and configuration should go here
app.MapAzureSignalR(GetType().FullName);
// Turn tracing on programmatically
GlobalHost.TraceManager.Switch.Level = SourceLevels.Error;
}
由于我们仍在使用.Net框架,似乎控制器没有自动注册,因此我不得不将它们显式地注册为瞬态。
我的问题是,我是否完全错过了什么? 我希望迈向Microsoft DI包的原因是它会像较新版本的.Net一样运行,但是我现在感到更容易转移到完全不同的IoC框架(例如Autofaq),以解决这些内存问题。