Hallo Ich benutze einen IoC Container und ich möchte einen Service initialisieren (ein Teil davon beinhaltet 'schwere Arbeit' im Gespräch mit einer Datenbank) innerhalb der Konstruktor.IoC Initialize Service mit Schwerarbeit im Konstruktor aber Vermeidung einer temporären Init() Methode
Dieser bestimmte Service speichert Informationen, die von einem injizierten IPluginToServiceProviderBridge
Service gefunden werden, diese Informationen werden in der Datenbank über eine UnitOfWork
gespeichert.
Sobald alles boot-bread ist, werden Controller mit Befehlen und Services mit Handlern für alle anderen Interaktionen verwendet. Alle Befehle sind innerhalb eines lebenslangen Gültigkeitsbereichs zusammengefasst, so dass das Speichern und Entsorgen des UnitOfWork
durch den Handler und nicht durch den Dienst erfolgt (dies ist ideal für sauberen Code).
Die gleiche Ordentlichkeit und Trennung von Bedenken für das Speichern und Transaktionen nicht für die Initializer
innerhalb des Dienstes gelten als alles Platz im Konstruktor:
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);
}
}
Ein paar Punkte:
Ideale I Ich möchte vermeiden, eine Fabrik zu verwenden, da es die Handhabung der Lebensdauer des Oszilloskops erschwert, und würde mich freuen, für eine bessere Trennung zu refaktorieren, wenn ich wüsste, wie.
Ich möchte wirklich vermeiden, eine separate Init()
Methode für den Service zu haben, während es Transaktion und Speichern über Befehl/Handler erlauben würde, viel Prüfcode wäre erforderlich und ich glaube, dass dies auch zeitliche Probleme einführen würde.
Angesichts der oben genannten, ist es akzeptabel, UnitOfWork.Save()
innerhalb meines Konstruktors anrufen oder könnte ich für sauberer Code und bessere Trennung umgestalten?
Ich stimme der Vermeidung der Init() -Methode zu. riecht nach zu viel Verantwortung für ein einzelnes Objekt. Fabrik ist der Weg, hier zu gehen. das Konzept sowieso. Sie sollten diese Art von Arbeit in der Ctor eines Objekts vermeiden.Wenn Sie den Umfang des Objekts verwalten können, wie kompliziert eine Fabrik das? –