由于 Unity 已被弃用,我最近将 .Net Framework 4.7.2 MVC 项目从 Unity 移至 Microsoft.Extensions.DependencyInjection。切换似乎很简单,主要变化是需要创建自定义DependencyResolver,因为这之前是由 Unity 处理的。
现在这些更改已在生产中进行,我开始注意到一些严重的内存问题。获取内存使用情况的转储显示内存中最大的项目来自ServiceProviderMicrosoft.Extensions.DependencyInjection,其中包含数千个尚未处理的控制器。
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);
}
}
Run Code Online (Sandbox Code Playgroud)
我已经根据我阅读的 stackoverflow 文章实现了这一点:How do I insert dependency in webapi …
我目前正在教自己ANTLR,在完成"The Definitive ANTLR Reference"一书时,我遇到了一个问题.我正在做第一个例子,并创建了语法文件,得到了我的Lexer和Parser Java文件,创建了以下Java程序来测试它:
import org.antlr.runtime.*;
public class Test
{
public static void main(String[] args) throws Exception
{
ANTLRInputStream input = new ANTLRInputStream(System.in);
TLexer lexer = new TLexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer);
TParser parser = new TParser(tokens);
parser.r();
}
}
Run Code Online (Sandbox Code Playgroud)
然后我使用命令行编译哪个工作正常,然后我尝试运行Java类,它失败了,整个命令行如下所示:
C:\Users\Dan\workspace\Test\src>dir
Volume in drive C is Acer
Volume Serial Number is ECB2-5E39
Directory of C:\Users\Dan\workspace\Test\src
17/09/2012 18:15 <DIR> .
17/09/2012 18:15 <DIR> ..
17/09/2012 18:32 723 Test.class
16/09/2012 20:51 353 Test.java
17/09/2012 18:32 3,641 TLexer.class
15/09/2012 21:35 …Run Code Online (Sandbox Code Playgroud)