gpt4 book ai didi

c# - 注册所有在应用程序启动时实现接口(interface)的类(Web API)

转载 作者:太空狗 更新时间:2023-10-30 00:40:33 26 4
gpt4 key购买 nike

更新:

基本上,这归结为“我如何强制类库在 Web API 站点的应用程序启动时加载,以便我可以通过它们进行一次反射(reflect)并确保我获得某个类的所有实现。或者,如果没有这样做的好方法,允许该库中的类自行注册的最佳方法是什么?

原始问题:

我试图在我的 Web API 中注册所有在应用程序启动时实现特定接口(interface)的类,并将它们放在一个列表中,这样我以后就可以找到它们,而无需在每次调用时通过程序集进行反射(reflect)。

这看起来相当简单,虽然我以前从未做过。因此,在谷歌搜索和阅读一些其他 Stack Overflow 问题之后,我创建了一个容器类并放置了一个方法来注册所有具体实现。简化的解决方案如下所示:

public static void RegisterAllBots()
{
var type = typeof(IRobot);
var types = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(s => s.GetTypes())
.Where(type.IsAssignableFrom);
foreach (var t in types)
{
TypeRepo.Add(t.Name.ToLower(), t);
}
}

然后我将 RegisterAllBots() 放入 Global.asax 的 Application_Start() 中。

问题是,有时(但不总是)如果我开始“冷”调试解决方案,它找不到实现,只能找到接口(interface)本身。如果我在运行之前转到 Build -> Rebuild Solution,它会找到它们。所以我假设这是 Visual Studio 在没有重建其他类库项目的情况下启动 WebHost 项目的问题。

所以我有几个问题。

  1. 我对这里的原因是否正确?
  2. 我怎样才能阻止它?
  3. 截至目前,这可以在生产中实现吗?我已经将它部署到一个测试站点,它似乎可以正常工作,但这可能只是运气,因为有时它确实会找到具体的实现。

最佳答案

AppDomain.CurrentDomain.GetAssemblies() 将仅返回已加载到当前应用程序域中的程序集,当使用该程序集中的类型时加载该程序集。

每当我过去需要这样做时,我只是维护一个程序集列表,即

var assemblies = new [] 
{
typeof(TypeFromAssemblyA).Assembly,
typeof(TypeFromAssemblyB).Assembly
};

这只需要包含每个程序集中的一种类型,以确保程序集加载到当前应用程序域中。

另一种选择是使用 Assembly.GetReferencedAssemblies()Assembly.Load(AssemblyName) 强制加载所有引用的程序集。参见 this question有关此方法的更多详细信息。之后您可以使用现有代码,因为所有程序集都已加载到应用程序域中。

第三种选择是使用类似 Managed Extensibility Framework (MEF) 的东西Export 并随后从目录中的程序集Import 类型。

您选择哪个选项取决于您的解决方案结构以及您希望发现实现的方式。我喜欢第一种方法,因为它明确说明将扫描哪些程序集,但最后一种方法无需重新编译即可实现更大的可扩展性。

关于c# - 注册所有在应用程序启动时实现接口(interface)的类(Web API),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27040982/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com