アセンブリの編成方法によって異なりますが、これを行う 1 つの方法を次に示します。MyTask と呼ばれるカスタム属性を定義して、対象のアセンブリ内のすべてのクラスを識別できるようにします。公開する名前は、例では「接続」などです。
次に、リフレクションを使用してアセンブリを挟み、必要なチャップを見つけて登録します。
属性と反射についてどれだけ知っているかわかりません
しかし、これは私のものです
[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 およびサービス検出ルートをたどる、ある種の構成ファイルについて話していることになります。