在我的应用程序中,我通常会有多个autofac模块,其中许多模块将执行一些检索程序集引用的工作,例如: Assembly.GetExecutingAssembly()
或builder.RegisterAssemblyTypes(assemblyRef)
等。通常不同的模块将检索相同的程序集,因此假设反射中存在开销,无论如何都要共享模块之间的程序集引用以使其更有效?
例如,是否适合在应用程序的根目录中创建对程序集的静态引用,以便每个模块可以引用它们?如果使用它们的唯一目的是注册过程,这似乎有点矫枉过正。
或者,我是否尝试优化不需要优化的东西?
答案 0 :(得分:1)
跨程序集的反射开销很小 - 它不像以前那样在.NET 1.1中。特别是在应用启动时一次性注册的意义上,您正在进入微优化领域。
如果您关注反射性能,我鼓励您实际测量它,然后尝试进行某种额外的参考缓存并查看差异。我敢打赌,你实际上并没有看到显着的节省 - 不足以证明额外的应用程序复杂性和更紧密的耦合。无论如何。
你可以做的一件事非常简单就是在你的模块中添加一个构造函数,它接受应该使用的程序集列表。
public class ScanningModule : Module
{
private IEnumerable<Assembly> _assemblies;
public ScanningModule(IEnumerable<Assembly> assemblies)
{
this._assemblies = assemblies;
}
protected override void Load(ContainerBuilder builder)
{
builder.RegisterAssemblyTypes(this._assemblies)...
}
}
注册模块时,将程序集传递给它。
var assemblies = ScanForTheAssemblies();
var builder = new ContainerBuilder();
builder.RegisterModule(new ScanningModule(assemblies));
...
var container = builder.Build();
然而,再一次,我不确定你是否会看到一个重要的性能提升,特别是因为它只发生过一次。