vacio una predeterminado polimorfico new herencia extraer español constructores caracteres cadena c# database constructor

predeterminado - extraer caracteres de una cadena c#



¿Está bien poner una llamada de inicialización de base de datos en un constructor de C#? (7)

El único problema que se me ocurre con este enfoque es que cualquier error de la inicialización de la base de datos se propagará como excepciones del constructor.

He visto que esto es varias bases de código, y quería saber si esto generalmente desaprobaba o no.

Por ejemplo:

public class MyClass { public int Id; public MyClass() { Id = new Database().GetIdFor(typeof(MyClass)); } }


Hay varias razones por las cuales esto generalmente no se considera un buen diseño, algunos de los cuales, como causar pruebas unitarias difíciles y la dificultad de manejo de errores, ya han sido mencionados.

La razón principal por la que elegiría no hacerlo es que su objeto y la capa de acceso a los datos ahora están estrechamente vinculados, lo que significa que cualquier uso de ese objeto fuera del diseño original requiere una repetición significativa. A modo de ejemplo, ¿qué sucede si encuentra una instancia en la que necesita usar ese objeto sin ningún valor asignado, por ejemplo, para conservar una nueva instancia de esa clase? ahora debe sobrecargar el constructor y luego asegurarse de que toda su otra lógica maneje este nuevo caso, o herede y anule.

Si el objeto y el acceso a los datos estaban desacoplados, podrías crear una instancia y luego no hidratarla. O si tiene un proyecto diferente que usa las mismas entidades pero usa una capa de persistencia diferente, los objetos son reutilizables.

Habiendo dicho eso, he tomado el camino más fácil de acoplamiento en proyectos en el pasado :)


Sí, puedes hacerlo, pero no es el mejor diseño, y el manejo de errores en los constructores no es tan ordenado como en otros lugares.



¿Por qué alguien querría usar un objeto / talón simulado en lugar de uno verdadero? ¿Estaría de acuerdo en que los fabricantes de automóviles deberían usar modelos de cartón para pruebas de fallas?


Bueno ... No lo haría. Pero, de nuevo, mi enfoque generalmente implica que la clase NO sea responsable de recuperar sus propios datos.


Puede usar el patrón desechable si se refiere a una conexión DB:

public class MyClass : IDisposable { private Database db; private int? _id; public MyClass() { db = new Database(); } public int Id { get { if (_id == null) _id = db.GetIdFor(typeof(MyClass)); return _id.Value; } } public void Dispose() { db.Close(); } }

Uso:

using (var x = new MyClass()) { /* ... */ } //closes DB by calling IDisposable.Dispose() when going out of "using" scope