如何在 .NET Core 项目中获取类库程序集引用?

Jas*_*son 4 .net system.reflection .net-core asp.net-core mapster

我有一个 ASP.NET Core 项目 (netcoreapp2.0),它引用类库项目 (netstandard2.0) 中的模型。我正在尝试使用 Mapster 来映射存储在类库中的对象。Mapster 的文档说使用以下代码从 Startup.cs 调用 Scan 方法:

TypeAdapterConfig.GlobalSettings.Scan(assembly1, assembly2, assemblyN)
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是如何最好地获取类库的程序集引用以传递给 Scan 方法。我认为这更像是一个一般的 .NET 问题,而不是特定于 Mapster 的问题。我能想到的最好的是以下内容,但感觉很尴尬。

private Assembly GetAssemblyByName(string name)
{
    var assemblies = Assembly.GetEntryAssembly().GetReferencedAssemblies();
    var assemblyName = assemblies.FirstOrDefault(i => i.Name == name);
    var assembly = Assembly.Load(assemblyName);
    return assembly;
}
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来处理这个问题?

更新:显然我上面的解决方案破坏了代码优先迁移。任何人都可以建议一种方法来实现这一目标吗?

gld*_*ael 7

使用其中定义的类型获取程序集。

var assembly = Assembly.GetAssembly(typeof(NameSpace.TypeName));
Run Code Online (Sandbox Code Playgroud)

更新以解决您的评论(但我不建议这样做):

使用GetExecutingAssembly()而不是,GetEntryAssembly()您在问题中的解决方案不会中断。奖励:GetReferencedAssemblies()用类似的东西过滤结果,.Where(a => a.Name.StartsWith("CompanyName"))你甚至可以摆脱name争论。

我不推荐这样做,因为:

  1. 我们最终会对程序集名称进行硬编码(直接或间接);我宁愿使用强类型。引用程序集的更改应该会破坏您的构建。
  2. 我们最终支付了启动性能损失。