Привет, я использую контейнер IoC, и я хотел бы инициализировать службу (, часть которой включает «тяжелую работу», связанную с базой данных )в конструкторе.
Эта конкретная служба хранит информацию, найденную внедренной службой IPluginToServiceProviderBridge
, эта информация сохраняется в базе данных через UnitOfWork
.
После того, как все загрузится -, контроллеры с командами и службы с обработчиками используются для всех остальных взаимодействий. Все команды заключены в область жизненного цикла, поэтому сохранение и удаление UnitOfWork
выполняется обработчиком, а не службой (, это отлично подходит для чистого кода ).
Та же аккуратность и разделение задач сохранения и транзакций не применимы к Initializer
внутри службы, так как все происходит в конструкторе:
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);
}
}
Пара точек:
В идеале я хочу избежать использования фабрики, поскольку это усложняет обработку времени жизни области, я был бы рад провести рефакторинг для лучшего разделения, если бы знал, как это сделать.
Я действительно хочу избежать отдельного метода Init()
для службы, в то время как он позволит выполнять транзакции и сохранять через команду/обработчик, потребуется много кода проверки, и я считаю, что это также приведет к временным проблемам.
Учитывая вышесказанное, допустимо ли вызывать UnitOfWork.Save()
в моем конструкторе, или я могу провести рефакторинг для более чистого кода и лучшего разделения?