在这个问题上,我正在处理一个应该作为工厂工作的映射器类。
到现在为止,我正在使用字典作为映射器。
IDictionary<string, Type> mapper;
这个想法是当我得到一个字典值时,这应该是实例化的,例如:
var foo = mapper["foo"]; // this should return the instance of foo
另一个问题是:
var foo2 = mapper["foo"] // should be the same instance of foo (foo == foo2)
几个月前,我想我已经看过一些关于容器的事情,我不确定这个术语是否正确,如果这可以帮助我。 有什么想法吗?
更新:
我真的没有任何代码。我在想的是字典的值应该是Func&lt;&gt;而不是Type,或者使用Activator类作为中间体,虽然我猜这些都不是好选择。我计划在代码中添加100多个项目,它会非常累。
答案 0 :(得分:1)
你的意思是这样吗?
abstract class MyBase { }
class Type1 : MyBase { }
class Type2 : MyBase { }
class Type3 : MyBase { }
private static readonly Dictionary<Type, Func<MyBase>> sConstructors =
new Dictionary<Type, Func<MyBase>>
{
{ typeof(Type1), () => new Type1() },
{ typeof(Type2), () => new Type2() },
{ typeof(Type3), () => new Type3() }
};
...
Type type = typeof(Type1);
MyBase myBase = sConstructors[type]();
使用反射,您甚至可以自动构建这些反射,而不必手动维护它们。
答案 1 :(得分:1)
它被称为Service Locator Anti-Pattern。
而是查看@drumboog建议的内容 - Dependency Injection Containers。
对字面意思的完整解释需要book。