【发布时间】:2014-02-21 14:49:22
【问题描述】:
我正在为 ASP.NET Web API 项目开发的“插件”系统出现一些奇怪的行为。插件是复制到 bin 文件夹中的 DLL。这意味着它们已经在当前的 AppDomain 中。
每个插件都有一个实现 IPluginConfiguration 的配置类。
以下类通过查找当前 AppDomain 中实现 IPluginConfiguration 接口的所有类来配置插件。这是从 Global.asax.cs 调用的
public class PluginConfigurator
{
/* ... */
public static void Register(HttpConfiguration config)
{
var pluginConfigs = GetPluginConfigurations();
try
{
foreach (var pluginConfigType in pluginConfigs)
{
var pluginConfig = (IPluginConfiguration) Activator.CreateInstance(pluginConfigType);
pluginConfig.Configure(config);
Logger.Log("Configured Type: {0}", pluginConfigType.FullName);
}
}
catch (ReflectionTypeLoadException e)
{
Logger.Log("Error of type: {0}", e.GetType().Name);
}
}
private static IEnumerable<Type> GetPluginConfigurations()
{
return AppDomain.CurrentDomain
.GetAssemblies()
.SelectMany(t => t.GetTypes())
.Where(type => !type.IsInterface)
.Where(type => typeof(IPluginConfiguration).IsAssignableFrom(type));
}
}
我的测试插件有以下配置。
public class PluginConfiguration : IPluginConfiguration
{
/* ... */
public void Configure(HttpConfiguration config)
{
try
{
Logger.Log("Configuring test plugin");
RegisterRoutes(config);
}
catch (Exception e)
{
Logger.Log("Error of type {0} in configuration", e.GetType().Name);
}
}
/* ... */
}
所以我希望我的日志文件会这样说
Configuring test plugin
Configured Type: MyNameSpace.PluginConfiguration
或
Configuring test plugin
Error of type MyNameSpace.PluginConfiguration in configuration
Configured Type: MyNameSpace.PluginConfiguration
但实际上我只是得到
Configured Type: MyNameSpace.PluginConfiguration
在此之前还有其他日志记录。我认为这可能是日志记录的问题,所以我让它在 PluginConfiguration 类中创建了一个文件,但它也没有这样做。看来我的 PluginConfiguration 类没有被调用。
我创建了一个调用 PluginConfigurator 类的单元测试,并且确实调用了该方法。
关于什么可能导致此问题或如何解决此问题的任何建议?
【问题讨论】:
标签: c# plugins reflection asp.net-web-api