Ninject: передать закрытый член в качестве аргумента конструктора

#asp.net-mvc #dependency-injection #ninject

#asp.net-mvc #внедрение зависимостей #ninject

Вопрос:

Я использую Ninject с ASP.NET MVC. По сути, я хочу передать защищенный элемент _connectionStringBuilder в классе BaseController в качестве аргумента конструктора классу SourceCodeManager.

Я в основном выполняю некоторую обработку на уровне контроллера, а затем хочу передать это в мои различные классы бизнес-уровня, такие как SourceCodeManager.

Я знаю, это звучит немного странно, но я в основном хочу передать одну и ту же переменную _connectionStringBuilder всем моим классам бизнес-уровня. (Я пытаюсь обновить классическое приложение ASP, где они хранят имя пользователя и пароль в файлах cookie!)

  public class SourceCodeManager :  ParisDataAccessManager, ISourceCodeManager
    {
        SourceCodeManager(IParisConnectionStringBuilder connectionStringBuilder)
            : base(connectionStringBuilder)
        {

        }

        public List<SourceCodeList> GetManualSourceCodes()
        {
            using (var connection = new SqlConnection(connectionStringManager.GetConnectionString()))
            {
                connection.Open();
                var manualSourcesCodes = connection
                    .Query<SourceCodeList>("select source_cd, source_desc where feeder_system_cd = 'ME'")
                    .ToList();
                return manualSourcesCodes;
            }
        }
    }

public class BaseController : Controller
{
    [Inject]
    public IParisConnectionStringBuilder _connectionStringBuilder { get; set; }
    // ...
}
  

Ответ №1:

Я не на 100% понимаю, в чем заключается ваш вопрос.

Однако, если вам нужен только один экземпляр IParisConnectionStringBuilder во всем вашем приложении, посмотрите на регистрацию в качестве синглтона в NInject.

Синтаксис выглядит примерно так:

 Bind<IParisConnectionStringBuilder>().To<ParisConnectionStringBuilder>().InSingletonScope();
  

Комментарии:

1. Спасибо, это решило проблему! Я внедряю конкретную реализацию IParisConnectionStringBuilder в класс BaseController, используя InSingletonScope(), и тот же экземпляр передается конструктору всех моих классов бизнес-уровня.