Как назначить новое значение объекту, созданному Autofac, и передать конструктору другого внедренного объекта? - PullRequest
1 голос
/ 24 марта 2019

Я внедряю внедрение зависимостей с помощью Autofac. У меня проблемы с использованием правильного экземпляра объекта, который я передаю в конструктор компонента.

Мое намерение состоит в том, чтобы Autofac создал и ReportFileGenerator, и ReportDefinition, а затем изменил значения ReportDefinition с помощью действия post в контроллере до , создав ReportFileGenerator, чтобы обновленное значение можно было передать в качестве его параметра. .

У меня есть ReportController :

public class ReportController
{        
    private readonly IReportFileGenerator _reportFileGenerator;

    private IReportDefinition _reportDefinition;

    public ReportController(            
        IReportFileGenerator reportFileGenerator,
        IReportDefinition reportDefinition
    {
        _reportFileGenerator = reportFileGenerator;
        _reportDefinition = reportDefinition;
    }

(...)

    [HttpPost]
    public ActionResult Report(ReportViewModel viewModel)
    {            
        _reportDefinition = viewModel.ReportDefinition

        return _reportFileGenerator.GenerateReportFile();
    }
}

ReportFileGenerator

public class ReportFileGenerator : IReportFileGenerator
{
    private readonly IReportDefinition _reportDefinition;

    public ReportFileGenerator(
        IReportDefinition reportDefinition)
    {            
        _reportDefinition = reportDefinition
    }

    public FileContentResult GenerateReportFile()
    {
        [some logic to generate file result using reportDefinition] 
    }
}

и, наконец, мои регистрации:

builder.RegisterType<ReportFileGenerator>()
   .As<IReportFileGenerator>()
   .InstancePerRequest();

builder.RegisterType<ReportDefinition>()
   .As<IReportDefinition>()
   .InstancePerRequest();

Проблема в том, что ReportDefinition, который передается в ReportFileGenerator, не имеет значений, назначенных в действии контроллера (это просто новый экземпляр со значениями по умолчанию).

1 Ответ

2 голосов
/ 24 марта 2019

Просмотр текущего дизайна.Похоже, что ReportDefinition следует использовать как явную зависимость для IReportFileGenerator.GenerateReportFile()

public interface IReportFileGenerator {
    FileContentResult GenerateReportFile(ReportDefinition reportDefinition);
}

Вы, похоже, используете ReportDefinition больше как модель, чем сервис.Я не вижу необходимости вводить его через конструктор.

public class ReportFileGenerator : IReportFileGenerator {

    public FileContentResult GenerateReportFile(ReportDefinition reportDefinition) {
        //[some logic to generate file result using reportDefinition] 
    }
}

, который позволил бы контроллеру вызывать IReportFileGenerator, как и предполагалось

public class ReportController { 
    private readonly IReportFileGenerator reportFileGenerator;

    public ReportController( IReportFileGenerator reportFileGenerator) {
        this.reportFileGenerator = reportFileGenerator;
    }

    //(...)

    [HttpPost]
    public ActionResult Report(ReportViewModel viewModel) { 
        ReportDefinition reportDefinition = viewModel.ReportDefinition;    
        return reportFileGenerator.GenerateReportFile(reportDefinition);
    }
}

В вашем первоначальном проекте вы видитенеправильно понять, как использовать DI в этой ситуации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...