如何从配置文件加载 Func<T> - 工厂模式 - Open Closed principal
How to load Func<T> from configuration file - Factory pattern - Open Closed principal
下面是我的工厂class:
public class BulkFactory<T>
{
private BulkFactory() { }
static readonly Dictionary<string, Func<T>> _dict
= new Dictionary<string, Func<T>>();
public static T Create(string id)
{
Func<T> constructor = null;
if (_dict.TryGetValue(id, out constructor))
return constructor();
throw new ArgumentException("No type registered for this id");
}
public static void Register(string id, Func<T> ctor)
{
_dict.Add(id, ctor);
}
}
这就是我向这家工厂注册各种批量工作的方式:
BulkFactory<IBulk>.Register("LCOUPD", () => new BAT_LCOUPD<BulkLCOUpdateRecord, BAT_LCOUPD_LOG>(bulkJobCode));
BulkFactory<IBulk>.Register("STBILL", () => new BAT_STBILL<BulkStartStopBillUpdateRecord, BAT_STBILL_LOG>(bulkJobCode));
BulkFactory<IBulk>.Register("PLANCH", () => new BAT_PLANCH<BulkPlanChangeUpdateRecord, BAT_PLANCH_LOG>(bulkJobCode));
BulkFactory<IBulk>.Register("CSCORE", () => new BAT_CSCORE<BulkCSCOREUpdateRecord, BAT_CSCORE_LOG>(bulkJobCode));
BulkFactory<IBulk>.Register("CUSTAQ", () => new BAT_CUSTAQ<CustomerAcquisitionTemplate, BAT_CUSTAQ_LOG>(bulkJobCode));
为了遵循 Open Closed 原则,我想将所有这些寄存器条目存储到配置文件中,并想从配置中加载回来。这样每当我添加一个新的批量作业时,我就不需要修改上面的代码行。
请建议我该如何实现。
假设你有一个 FactoryMethod
数组:
public sealed class FactoryMethod {
public string Name { get; set; }
public string Type { get; set; }
}
你以某种方式从你的配置文件中读取,其中 Name
是你要注册的 class 名称(LCOUPD
、STBILL
等等)和 Type
是 Type.GetType() 对泛型类型要求的格式:
TClass`2[TGenericType1, TGenericType2].
例如(假设一个虚构的命名空间 Ns
):
Ns.BAT_CUSTAQ`2[Ns.CustomerAcquisitionTemplate, Ns.BAT_CUSTAQ_LOG]
那么你可以这样写代码:
foreach (var factoryMethod in factoryMethods) {
BulkFactory<IBulk>.Register(factoryMethod.Name,
(IBulk)Activator.CreateInstance(Type.GetType(factoryMethod.Type), bulkJobCode));
}
请注意,我不知道您的 classes 和函数原型的确切类型,因此您可能需要在这里或那里进行强制转换。
下面是我的工厂class:
public class BulkFactory<T>
{
private BulkFactory() { }
static readonly Dictionary<string, Func<T>> _dict
= new Dictionary<string, Func<T>>();
public static T Create(string id)
{
Func<T> constructor = null;
if (_dict.TryGetValue(id, out constructor))
return constructor();
throw new ArgumentException("No type registered for this id");
}
public static void Register(string id, Func<T> ctor)
{
_dict.Add(id, ctor);
}
}
这就是我向这家工厂注册各种批量工作的方式:
BulkFactory<IBulk>.Register("LCOUPD", () => new BAT_LCOUPD<BulkLCOUpdateRecord, BAT_LCOUPD_LOG>(bulkJobCode));
BulkFactory<IBulk>.Register("STBILL", () => new BAT_STBILL<BulkStartStopBillUpdateRecord, BAT_STBILL_LOG>(bulkJobCode));
BulkFactory<IBulk>.Register("PLANCH", () => new BAT_PLANCH<BulkPlanChangeUpdateRecord, BAT_PLANCH_LOG>(bulkJobCode));
BulkFactory<IBulk>.Register("CSCORE", () => new BAT_CSCORE<BulkCSCOREUpdateRecord, BAT_CSCORE_LOG>(bulkJobCode));
BulkFactory<IBulk>.Register("CUSTAQ", () => new BAT_CUSTAQ<CustomerAcquisitionTemplate, BAT_CUSTAQ_LOG>(bulkJobCode));
为了遵循 Open Closed 原则,我想将所有这些寄存器条目存储到配置文件中,并想从配置中加载回来。这样每当我添加一个新的批量作业时,我就不需要修改上面的代码行。
请建议我该如何实现。
假设你有一个 FactoryMethod
数组:
public sealed class FactoryMethod {
public string Name { get; set; }
public string Type { get; set; }
}
你以某种方式从你的配置文件中读取,其中 Name
是你要注册的 class 名称(LCOUPD
、STBILL
等等)和 Type
是 Type.GetType() 对泛型类型要求的格式:
TClass`2[TGenericType1, TGenericType2].
例如(假设一个虚构的命名空间 Ns
):
Ns.BAT_CUSTAQ`2[Ns.CustomerAcquisitionTemplate, Ns.BAT_CUSTAQ_LOG]
那么你可以这样写代码:
foreach (var factoryMethod in factoryMethods) {
BulkFactory<IBulk>.Register(factoryMethod.Name,
(IBulk)Activator.CreateInstance(Type.GetType(factoryMethod.Type), bulkJobCode));
}
请注意,我不知道您的 classes 和函数原型的确切类型,因此您可能需要在这里或那里进行强制转换。