如何在Autofac模块之间共享程序集引用

本文关键字:之间 共享程序集 引用 模块 Autofac | 更新日期: 2023-09-27 18:19:19

在我的应用程序中,我通常会有多个autofac模块,其中许多模块将执行一些检索汇编引用的工作,例如Assembly.GetExecutingAssembly()builder.RegisterAssemblyTypes(assemblyRef)等。通常不同的模块将检索相同的程序集,因此假设在反射中存在开销,那么是否可以在模块之间共享程序集引用以提高效率?

例如,在应用程序的根目录中创建对程序集的静态引用,以便每个模块都可以引用它们,这样合适吗?如果使用它们的唯一目的是为了注册过程,这似乎有点过分。

或者,我正在尝试优化一些不需要优化的东西吗?

如何在Autofac模块之间共享程序集引用

跨程序集的反射开销非常小-这与。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();

但是,我不确定您是否会看到一个主要的性能提高,特别是因为它只发生一次。