Ninject связывает два разных параметра одного типа в Global.asax

У меня есть веб-приложение с двумя разными контроллерами, и я использую файлы конфигурации в качестве входных данных для контроллеров. Раньше я использовал только один файл конфигурации и мог просто привязать его к ядру, и все работало нормально. Однако теперь я буду использовать два отдельных файла конфигурации, и мне понадобится ninject, чтобы понять, какой из них использовать. Вот пример того, как я думал, что я буду делать. Закомментировано также то, что я делал для привязки конфигурации раньше, когда у меня была только одна.

        var kernel = NinjectWebApi.Kernel;
        //get base dependency instances from the container
        var configurationClient = kernel.Get<IConfigurationClient>();

        //initialise local dependencies
        var config1 = configurationClient.Get(new GetConfigurationByKeyRequest("Config1"));
        var config2 = configurationClient.Get(new GetConfigurationByKeyRequest("Config2"));

        //bind local dependencies

//This is what I did when I had just one config
        //kernel.Bind<IConfiguration>().ToMethod(c => config1.Configuration); 

        kernel.Bind<IMy1Controller>().To<My1Controller>()
            .WithConstructorArgument("config1", config1.Configuration)
            .WithConstructorArgument("config2", config2.Configuration);

            kernel.Bind<IMy2Controller>().To<My2Controller>()
                .WithConstructorArgument("config2", config2.Configuration);

        //Set the dependency resolver to use ninject
        GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel);

Какова цель «WithConstructorArgument», если я не могу использовать его для указания ввода?


person jimmy    schedule 13.12.2016    source источник


Ответы (1)


Итак, я нашел решение. Но я не уверен, что это правильный путь.

var kernel = NinjectWebApi.Kernel;
    //get base dependency instances from the container
    var configurationClient = kernel.Get<IConfigurationClient>();

    //initialise local dependencies
    var config1 = configurationClient.Get(new GetConfigurationByKeyRequest("Config1"));
    var config2 = configurationClient.Get(new GetConfigurationByKeyRequest("Config2"));

    //bind local dependencies
    kernel.Bind<IConfiguration>().ToMethod(c => config1.Configuration).Named("config1");

    kernel.Bind<IConfiguration>().ToMethod(c => config1.Configuration).Named("config1"); 

    kernel.Bind<IMy1Controller>().To<My1Controller>()

        kernel.Bind<IMy2Controller>().To<My2Controller>()

    //Set the dependency resolver to use ninject
    GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel);

И чтобы ninject знал, какой из них использовать, мне нужно немного изменить подпись в конструкторе:

public My1Controller([Named("Config1")] IConfiguration config1)
person jimmy    schedule 13.12.2016