2

我是编程新手,请多多包涵。我使用 c sharp,.net 4,VS 2010

我有一个IHandler用 method调用的接口类IsValidate()。我有一条消息,例如AMOUNT 50 22.4AMOUNT标识符在哪里。所以消息的格式可以像FLOW 12 33 23.1FLOW标识符在哪里。

现在,根据标识符,我有不同的类(我有大约 15-20 个这样的类,因为我必须验证不同的消息格式和序列)

  1. AmountValidator

  2. FlowValidator

在这些类中,我有IsValidate()方法的实现,因为这些实现IHandler类。

现在我的问题是,一旦我确定了我的消息的标识符,AMOUNT或者FLOW我想创建类的实例。

最好的方法是什么?(我不想在 if else 语句中创建 30 个实例)

感谢任何帮助。

4

3 回答 3

3

你可以这样做:

IHandler handler = (IHandler)Activator.CreateInstance("assemblyname", "typename");
handler.IsValidate();

程序集名称可以在处理程序所在项目的属性页面上找到。

这里:程序集名称

您还必须记住,所有内容都区分大小写,因此如果类实际上命名为 AmountValidator,则 typename 参数不能是 AMOUNTValidator。

编辑:工厂样品:

public static class HandlerFactory {
    private static Object factoryLock = new Object();
    private static List<IHandler> handlers = null;

    public static IHandler Gethandler(String type) {
        if (handlers == null) {
            lock (factoryLock) {
                if (handlers == null) {
                    IEnumerable<Type> types = typeof(HandlerFactory).Assembly.GetTypes().Where(t => t.GetInterfaces().Contains(typeof(IHandler)));
                    handlers = types.Select(t => (IHandler)Activator.CreateInstance(t));
                }
            }
        }
        return handlers.Where(h => h.Type == type);
    }
}

public interface IHandler {
    String Type { get; }
    Boolean IsValid(String data);
}
于 2012-07-27T11:35:32.567 回答
2

假设验证器是无状态的,您应该在构造函数中列出验证器一次的工厂实现:

    public class HandlerFactory
{
    private Dictionary<string, IHandler> _handlers = new Dictionary<string,IHandler>();

    public HandlerFactory()
    {
        _handlers.Add("AMOUNT", new AmountValidator());
        _handlers.Add("FLOW", new FlowValidator());
    }

    public IHandler Create(string key)
    {
        IHandler result;
        _handlers.TryGetValue(key, out result);
        return result;
    }
}

如果您希望我详细说明反射和 IoC,请告诉我。这会改变你初始化字典的方式。

于 2012-07-27T13:20:44.763 回答
1

如果您的所有IHandler类都包含在与您的应用程序相同的程序集中(不像插件那样动态加载),工厂方法模式可能是一个不错的选择。IHandler您可以使用此设计模式集中创建类。另一方面,如果IHandler类是在运行时加载的,则需要利用.NET Reflection。还有一些开源IoC 容器可以帮助创建对象,但我想它们有点矫枉过正。

于 2012-07-27T12:09:54.813 回答