1

下面是我的工厂类:

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 主体,我想将所有这些寄存器条目存储到配置文件中,并希望从配置中加载它。因此,每当我添加一个新的批量作业时,我都不需要修改上面的代码行。

请建议我怎样才能做到这一点。

4

1 回答 1

2

假设你有一个FactoryMethod数组:

public sealed class FactoryMethod {
    public string Name { get; set; }
    public string Type { get; set; }
}

您以某种方式从配置文件中读取了您Name要注册的类名(等等),并且LCOUPD是Type.GetType ()泛型类型所需的格式:STBILLType

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));
}

请注意,我不知道您的类的确切类型和函数的原型,那么您可能需要在这里或那里进行转换。

于 2015-12-01T17:01:47.663 回答