Внедрение данных времени выполнения в зависимости - PullRequest
0 голосов
/ 31 октября 2019

У меня есть веб-приложение с довольно сложным процессом, который начинается с получения набора данных из базы данных для использования в течение всего процесса (время жизни этого процесса и данных - один запрос). Данные извлекаются из нескольких разных таблиц и основаны на некоторых данных, переданных во время выполнения.

Точка входа этого процесса вызывает методы из его зависимостей, которые используют эти данные. Однако это не совсем правильно, так как кажется, что зависимости должны действительно иметь зависимости от DataAccessor, а не инициализировать его в методе ввода (DoStuff), а затем передавать его всему процессу, но поскольку DataAccessor имеет состояние на основеданные, передаваемые в метод DoStuff, я не могу этого сделать.

public class Service {

    private readonly IRepository repo;
    private readonly Analyzer analyzer;
    private readonly Validator validator;     

    public Service(IRepository _repo, Validator _validator, Analyzer _analyzer){
        repo = _repo;
        validator =_validator;
        analyzer = _analyzer;
    }

    public void DoStuff(string sourceId, AnalysisConfig config, List<Item> items){

        // go get data used for this process based on the runtime data
        // it's going to be a subset of the database data based on the runtime data passed into this method
        DataAccessor data = BuildDataAccesor(config, items);

        foreach(var item in items){
            ProcessItem(sourceId, config, data, item);
        }

    }

    //this method doesn't really need all these parameters, I'm only passing them in so they make it through to the other dependencies
    public void ProcessItem(string sourceId, AnalysisConfig config, DataAccessor data, Item item){

        //do some stuff

        //then
        analyzer.AnalyzeItem(sourceId, config, data, item);
        validator.ValidateItem(sourceId, data, item );

   }


    // this goes an gets some data from the database to store in memory for the length of the DoStuff method
    public DataAccessor BuildDataAccesor(AnalysisConfig config, List<Item> items){
        DataAccessor data = new DataAccessor();
        data.FooCollection = repo.GetSomeData(config);
        data.BarCollection = repo.GetSomeOtherData(config);
    }


}

И зависимости

public class Analyzer{

    public void AnalyzeItem(string sourceId, AnalysisConfig config, DataAccessor data, Item item){
       //do some stuff with the item looking up stuff from the data blob
       data.FooCollection.Get(item.Id);
    }



}

и другие

public class Validator {

    public void ValidateItem(string sourceId, DataAccessor data, Item item){
       //do some stuff with the item looking up stuff from the data blob
    }

}

Этобудет более сложным, чем это, но я думаю, что это отражает суть. Есть ли способ реорганизовать это так, чтобы я мог инициализировать DataAccessor с данными времени выполнения и вставить в зависимости Service?

...