¿Cómo crear una fábrica?

En este momento, estoy tratando con una clase de mapeador que debería funcionar como una fábrica.

Hasta ahora, estoy usando un diccionario como mapeador.

IDictionary<string, Type> mapper;

La idea es cuando obtengo un valor del diccionario, esto debería ser instanciado, por ejemplo:

var foo = mapper["foo"];  // this should return the instance of foo

Y otro problema es:

var foo2 = mapper["foo"]  // should be the same instance of foo (foo == foo2)

Hace meses, supongo que había visto algo sobre contenedores, no estoy seguro si el término es correcto y si esto me puede ayudar. ¿Algunas ideas?

ACTUALIZACIÓN:

Realmente no tengo ningún código. Lo que estaba pensando es que el diccionario debería tener como valor Func<> en lugar de Type, o usar la clase Activator como intermedia, aunque supongo que estas no son buenas opciones. Planeo agregar más de 100 elementos en el código detrás, y será muy cansado.

preguntado el 28 de julio de 12 a las 03:07

Por favor, sea un poco más apreciado, ¿cuál es el código que crea el objeto? Estoy seguro de que he desarrollado algo similar pero necesito más información. -

Los contenedores de los que estaba hablando se refieren al contenedor de inyección de dependencia. Hay varias bibliotecas disponibles que hacen lo que quiere hacer, a menos que tenga su propia razón para crear su propia solución para esto. -

Bueno, esto es algo así como un diccionario de fábrica, ¿crees que esos contenedores pueden comportarse como una fábrica de creación? -

Sería mejor evitar inventar su propia terminología. "Mapeador creacional" no significa nada. Cualquier fábrica crea. Tira esas palabras, describe lo que quieres do. -

Eche un vistazo a los contenedores de inyección de dependencia... estos pueden usarse para generar objetos dinámicamente. He usado Unity bastante, pero cualquiera de ellos logra el mismo objetivo... hanselman.com/blog/… -

2 Respuestas

Quieres decir así?

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

Usando la reflexión, incluso puede crearlos automáticamente en lugar de tener que mantenerlos manualmente.

Respondido 28 Jul 12, 04:07

Se llama el Antipatrón del localizador de servicios.

En su lugar, mire lo que sugirió @drumboog: Recipientes de inyección de dependencia.

Una explicación completa de esto requiere literalmente una primer libro.

Respondido 28 Jul 12, 05:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.