0

此时此刻,我正在处理一个应该作为工厂工作的映射器类。

到目前为止,我使用字典作为映射器。

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<> 而不是 Type 的值,或者使用类 Activator 作为中间,虽然我猜这些不是好的选择。我打算在后面的代码中添加100多个项目,会很累。

4

2 回答 2

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]();

使用反射,您甚至可以自动构建它们,而不必手动维护它们。

于 2012-07-28T03:19:25.453 回答
1

它被称为服务定位器反模式

相反,请查看@drumboog 建议的内容 -依赖注入容器

对这一点的完整解释实际上需要一本书

于 2012-07-28T04:53:54.753 回答