取决于您的程序集的组织方式,但这是一种方法。定义一个名为 MyTask 的自定义属性,这样您就可以识别感兴趣的程序集中的所有类,并且您想要公开的名称例如在您的示例中为“connect”。
然后使用反射来筛选组件,找到你想要的小伙子并注册它们。
不知道你对属性和反射了解多少
但这是我的一个
[System.AttributeUsage(System.AttributeTargets.Class, AllowMultiple = false, Inherited = true)]
public sealed class ConversionAttribute : System.Attribute
{
public string DatabaseName { get; set; }
public bool ReadOnly { get; set; }
public int ConversionOrder { get; set; }
public String VersionStart { get; set; }
public String VersionEnd { get; set; }
}
一个类是这样标记的
[Conversion(ConversionOrder = 14)]
public class ConversionExample : DataConversion
这个章节贯穿整个程序集,抓住任何用 ConversionAttribute 标记的东西,实例化它,然后调用一个方法。
public static void DoConversions()
{
Type[] contents = CommandLine.Instance.TaskAssembly.GetExportedTypes();
SortedDictionary<int, List<Type>> conversions = new SortedDictionary<int, List<Type>>();
foreach (Type t in contents)
{
ConversionAttribute attr = FindAttribute(t);
if (attr != null)
{
if (!conversions.ContainsKey(attr.ConversionOrder))
{
conversions.Add(attr.ConversionOrder, new List<Type>());
}
conversions[attr.ConversionOrder].Add(t);
}
}
foreach (int order in conversions.Keys)
{
foreach (Type t in conversions[order])
{
ConstructorInfo c = t.GetConstructor(new Type[] { typeof(CommandLine) });
DataConversion d = (DataConversion)c.Invoke(new object[] { CommandLine.Instance });
ConversionVersionStatus status = d.VersionStatus(CommandLine.Instance.TaskParameterValue("TAX_FULL_VERSION"));
if ((status == ConversionVersionStatus.NoVersionSet) || (status == ConversionVersionStatus.Relevant))
{
d.Log(String.Format(CultureInfo.InvariantCulture, "Started Conversion {0}", d.FriendlyName));
d.ExecuteTask();
d.Log(String.Format(CultureInfo.InvariantCulture, "Finished Conversion {0}", d.FriendlyName));
}
else
{
if (status == ConversionVersionStatus.Discontinued)
{
d.Log(String.Format(CultureInfo.InvariantCulture, "Conversion {0} skipped as discontinued", d.FriendlyName));
}
else
{
d.Log(String.Format(CultureInfo.InvariantCulture, "Conversion {0} skipped as not yet relevant", d.FriendlyName));
}
}
}
}
}
所以基本上要添加一个新任务,我们在 dll 中定义它,用那个属性标记它,工作完成。
在此之后,您正在谈论某种配置文件,无论是显式配置文件,还是沿着 DI 和服务发现路线进行。