让我描述一下我目前拥有的问题和解决方案,也许您可以帮助我了解为什么这是一个坏主意(假设是)以及我可以做些什么来使它成为一个更好的系统。
现在我有 600 个“开膛手”来解析文件并将它们撕成 csv 或其他格式。裂土器都实现了一个通用接口和基类。当作业根据该作业的配置排队时,使用反射调用特定的 ripper。
foreach (var stream in streams)
{
try
{
// load it
Assembly asm = Assembly.LoadFile(Path.Combine(stream.RipperPath, stream.RipperFileName), new Evidence());
if (asm == null)
{
MessageBox.Show(String.Format("Invalid Interface ripper loaded.\n{0}", Path.Combine(stream.RipperPath, stream.RipperFileName)));
return;
}
foreach (Type objType in asm.GetTypes())
{
if (!objType.IsPublic)
continue;
// make sure the type isn't Abstract
if (((objType.Attributes & TypeAttributes.Abstract) == TypeAttributes.Abstract))
continue;
// IRipper is the interface that all of the Rippers must implement to be loaded
Type objInterface = objType.GetInterface("IRipper", true);
if (objInterface == null)
continue;
try
{
var iri = (IRipper)Activator.CreateInstance(objType);
// Rippers must register with their hosts
iri.Host = this;
iri.OnStart += RipperStart;
iri.OnComplete += RipperComplete;
iri.OnProgressChanged += RipperStatusUpdate;
iri.dataStream = stream;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
catch (Exception ex)
{
MessageBox.Show(String.Format("Error loading interface: {0}\n{1}", Path.Combine(stream.RipperPath, stream.RipperFileName), ex.Message));
}
}
所有开膛手都实现了一个名为“Rip()”的函数,接口将它们收缩到该函数。
使用当前代码,我能看到的唯一问题是在加载 600 个程序集后(因为它们是在需要时加载的),如果它们在使用后没有被卸载,它会开始变得有点慢。
你有什么建议?