我是编程的新手,善待我。我使用c sharp,.net 4,VS 2010
我有一个名为IHandler
的接口类,其方法为IsValidate()
。
我有AMOUNT 50 22.4
之类的消息,其中AMOUNT
是标识符。
因此,消息格式可以类似于FLOW 12 33 23.1
,其中FLOW
是标识符。
现在,基于标识符,我有不同的类(我有大约15 - 20个这样的类,因为我必须验证不同的消息格式和序列)
AmountValidator
FlowValidator
在这些类中,我实现了IsValidate()
方法,因为它们实现了IHandler
类。
现在我的问题是,一旦我确定了我的消息的标识符,例如AMOUNT
或FLOW
,我想创建该类的实例。
最好的方法是什么?(我不想在if else语句中创建30个实例)
感谢任何帮助。
答案 0 :(得分: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);
}
答案 1 :(得分: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;
}
}
如果您希望我详细说明Reflection和IoC,请告诉我。这会改变你初始化字典的方式。
答案 2 :(得分:1)
如果所有IHandler
类都包含在与应用程序相同的程序集中(不像插件那样动态加载),Factory method pattern可能是个不错的选择。您可以使用此设计模式集中创建IHandler
类。
另一方面,如果在运行时加载IHandler
类,则需要利用.NET Reflection。
还有开源IoC containers可以帮助创建对象,但我猜它们有点过分。