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

How can I share assembly references between Autofac modules

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

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

或者,我是否正在尝试优化不需要优化的内容?

程序集之间的反射开销非常小 - 这与过去在 .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();

但是,我不确定您是否会看到性能的大幅提升,尤其是因为它只会发生一次。