我有一个需要根据任务类型解析的Task实体。我会在类中封装特定类型的Task的逻辑,但是将类型与实现解析逻辑的类匹配的普遍接受的方法是什么?
我的第一个冲动是做一个工厂,比如:
TaskResolverFactory.GetForType(TaskType) // returns IsATaskResolver, which has a Resolve method
可能在工厂内部,一个Case语句或其他东西。
另一种想法是使用类似StructureMap
的东西,但我认为这种情况有点过分 - 你同意吗?
我缺少哪些其他方法,以及更换大型Case / Switch语句的普遍接受的方法是什么?
答案 0 :(得分:2)
你是对的 - Factory
是这个问题的经典模式。
如果这是你需要做这种解决的唯一地方(而且逻辑很简单),我同意 - StructureMap
过度杀伤。
答案 1 :(得分:1)
你可能会考虑这样的事情:
public class TaskResolverAttribute : Attribute
{
public Type ResolverType { get; private set; }
public TaskResolverAttribute(Type resolverType)
{
if (!typeof(ITaskResolver).IsAssignableFrom(resolverType))
throw new ArgumentException("resolverType must implement ITaskResolver");
ResolverType = resolverType;
}
}
public class MyTaskResolver : ITaskResolver
{
}
[TaskResolver(typeof(MyTaskResolver))]
public class MyTask
{
}
public static class TaskResolverFactory
{
public static ITaskResolver GetForType(Type taskType)
{
var attribute =
Attribute.GetCustomAttribute(taskType, typeof(TaskResolverAttribute)) as TaskResolverAttribute;
if (attribute == null)
throw new ArgumentException("Task does not have an associated TaskResolver");
return (ITaskResolver)Activator.CreateInstance(attribute.ResolverType);
}
}
答案 2 :(得分:0)
工厂是可行的方式。
至于big switch语句,您的其他选项包括:
我认为反射路径是最容易维护的,但是当你还没有类型时会出现复杂性(假设你的“类型”是Type
)。
由于您已经拥有该类型,其余部分非常简单:
public static Task GetByType(Type taskType)
{
return Activator.CreateInstance(taskType) as Task;
}