IoC Initialize Service с тяжелой -работой в конструкторе, но без использования временного метода Init ()

Привет, я использую контейнер 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()в моем конструкторе, или я могу провести рефакторинг для более чистого кода и лучшего разделения?

6
задан jruizaranguren 18 October 2015 в 09:48
поделиться