【问题标题】:How to get class library assembly reference in .NET Core project?如何在 .NET Core 项目中获取类库程序集引用?
【发布时间】:2018-04-24 16:24:38
【问题描述】:

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

TypeAdapterConfig.GlobalSettings.Scan(assembly1, assembly2, assemblyN)

我遇到的问题是如何最好地将类库的程序集引用传递给 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;
}

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

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

【问题讨论】:

  • 如果您要对某个问题投反对票,请礼貌地解释原因。

标签: .net asp.net-core .net-core system.reflection mapster


【解决方案1】:

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

var assembly = Assembly.GetAssembly(typeof(NameSpace.TypeName));

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

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

我不建议这样做,因为:

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

【讨论】:

  • 啊,好吧,那行得通。我想我希望得到的东西不依赖于对程序集内容的了解,但它让我更接近我的目标。谢谢!如果没有更多以装配为中心的内容出现,我会尽快将其标记为答案。
  • @Jason 迟到的回复我知道...我添加了一个更新,它不依赖于对程序集内容的了解(但仍然需要对程序集的了解)
猜你喜欢
  • 2019-11-25
  • 2017-12-31
  • 1970-01-01
  • 1970-01-01
  • 2010-12-09
  • 1970-01-01
  • 2016-11-26
  • 2020-04-19
  • 1970-01-01
相关资源
最近更新 更多