Pha*_*lon 4 c# asp.net-mvc asp.net-web-api
更新:
基本上,这可以归结为"如何强制类库在Application API上加载Web API站点,这样我就可以反思它们一次,并确保我得到某个类的所有实现.或者,如果没有好办法这样做,允许该库中的类自我注册的最佳方法是什么?
原始问题:
我正在尝试在我的Web API中注册在应用程序启动时实现某个接口的所有类,并将它们放在一个列表中,这样我就可以在以后找到它们,而不会在每次调用时反映组件.
看起来相当简单,虽然我以前从未这样做过.所以经过一些谷歌搜索和阅读其他一些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);
}
}
Run Code Online (Sandbox Code Playgroud)
然后我将RegisterAllBots()放在Global.asax的Application_Start()中.
问题是,有时(但不总是),如果我开始调试解决方案"冷",它找不到实现,只找到接口本身.如果我在运行之前转到Build - > Rebuild Solution,它会找到它们.所以我假设这是Visual Studio启动WebHost项目而不重建其他类库项目的问题.
所以我在这里有几个问题.
AppDomain.CurrentDomain.GetAssemblies() 只返回已加载到当前app域的程序集,当使用该程序集中的类型时,将加载程序集.
每当我需要在过去做这个时,我只需要维护一个程序集列表,即
var assemblies = new []
{
typeof(TypeFromAssemblyA).Assembly,
typeof(TypeFromAssemblyB).Assembly
};
Run Code Online (Sandbox Code Playgroud)
这只需要包含每个程序集中的一种类型,以确保程序集加载到当前应用程序域中.
另一种选择是使用Assembly.GetReferencedAssemblies()和强制加载所有引用的程序集Assembly.Load(AssemblyName).有关此方法的更多详细信息,请参阅此问题.然后,您可以在此之后使用现有代码,因为所有程序集都已加载到应用程序域中.
第三个选择是利用类似的托管扩展框架(MEF)来Export,然后Import从目录中的组件类型.
您选择哪个选项取决于您的解决方案结构以及您希望如何发现实现.我喜欢第一种方法,因为它明确指出将扫描哪些程序集,但最后一种方法允许更多的可扩展性而无需重新编译.
| 归档时间: |
|
| 查看次数: |
756 次 |
| 最近记录: |