Si, por alguna razón, necesita que la fábrica y la clase construida estén en ensamblajes separados (lo que significa que simplemente usando internal
no funcionará), y puede asegurarse de que su fábrica tenga la oportunidad de funcionar primero, usted puede hacer esto:
// In factory assembly:
public class Factory
{
public Factory()
{
token = new object();
MyClass.StoreCreateToken(token);
}
public MyClass Create()
{
return new MyClass(token);
}
private object token;
}
// In other assembly:
public class MyClass
{
public static void StoreCreateToken(object token)
{
if (token != null) throw new InvalidOperationException(
"Only one factory can create MyClass.");
this.token = token;
}
public MyClass(object token)
{
if (this.token != token) throw new InvalidOperationException(
"Need an appropriate token to create MyClass.");
}
private static object token;
}
Sí, es engorroso e incómodo. Pero puede haber situaciones extrañas donde esta es realmente una buena solución.
Me gusta esto, excepto que hay 2 problemas ... (1) Su ejemplo parece permitirme usar solo 1 fábrica. Me gustaría permitir que se creen muchas fábricas (tal vez hay diferentes sabores de fábrica) el único requisito es que un objeto de MyClass se debe crear utilizando un objeto de fábrica. (2) ¿Qué ocurre si uso genéricos con una nueva restricción() y, por lo tanto, MyClass necesita tener un constructor sin parámetros? Tu ejemplo no funcionaría en ese escenario. – JoelFan
"Tu ejemplo parece permitirme usar solo 1 fábrica". Convierta 'token' estático o compártalo entre las diferentes instancias de fábrica de otra manera. Cualquier cosa que tenga acceso al token puede crear instancias de 'MyClass'" ¿Qué sucede si estoy usando genéricos con una restricción new() y, por lo tanto, MyClass necesita tener un constructor sin parámetros? " Entonces tampoco necesitas una fábrica. – munificent