Hola, estoy usando un contenedor IoC y me gustaría inicializar un servicio (parte del cual implica "trabajo pesado" hablando con una base de datos) el constructorIoC Initialize Service con trabajo pesado en constructor pero evitando un método Init() temporal
Este servicio particular almacena información que se encuentra en un servicio IPluginToServiceProviderBridge
inyectado, esta información se guarda en la base de datos a través de UnitOfWork
.
Una vez que todo está bien ajustado, los controladores con comandos y los servicios con controladores se usan para cualquier otra interacción. Todos los comandos se envuelven dentro de un alcance de por vida, por lo que guardar y deshacerse de UnitOfWork
es hecho por el manejador y no por el servicio (esto es ideal para código limpio).
La misma pulcritud y la separación de las preocupaciones para el ahorro y las transacciones no se aplica para el Initializer
dentro del servicio, ya que todo se lleva a cabo en el constructor:
public PluginManagerService(
IPluginToServiceProviderBridge serviceProvider,
IUnitOfWork unitOfWork)
{
this.unitOfWork = unitOfWork;
this.serviceProvider = serviceProvider;
lock (threadLock)
{
if (initialised == false)
{
LinkPluginsWithDatabase();
initialised = true;
}
// I don't like this next line, but
// not sure what else to do
this.UnitOfWork.Save();
}
}
protected void LinkPluginsWithDatabase()
{
var plugins =
this.serviceProvider.GetAllPlugins();
foreach (var plugin in plugins)
{
var db = new PluginRecord
{
interfaceType = plugin.InterfaceType;
var id = plugin.Id;
var version = plugin.Version;
}
// store in db via unit of work repository
this.unitOfWork.PluginsRepository.Add(db);
}
}
Un par de puntos:
Lo ideal quiero evitar el uso de una fábrica, ya que complica el manejo de la vida útil del osciloscopio, me gustaría refactorizar para una mejor separación si supiera cómo.
Realmente quiero evitar tener un método Init()
separado para el servicio, mientras que permitiría la transacción y el guardado a través del comando/controlador, se requerirían muchos códigos de comprobación y creo que esto también introduciría problemas temporales.
Dado lo anterior, ¿es aceptable llamar al UnitOfWork.Save()
dentro de mi constructor o podría refactorizar para obtener un código más limpio y una mejor separación?
Acepto evitar el método Init(). huele a demasiada responsabilidad por un solo objeto. fábrica es el camino a seguir aquí. el concepto de todos modos. deberías evitar este tipo de trabajo en el ctor de un objeto.si puede gestionar el alcance del objeto, ¿cómo lo complica una fábrica? –