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

时间:2015-10-27 08:25:56

标签: c# .net module .net-assembly autofac

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

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

或者,我是否尝试优化不需要优化的东西?

1 个答案:

答案 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();

然而,再一次,我不确定你是否会看到一个重要的性能提升,特别是因为它只发生过一次。