Я новичок в IoC, столкнулся с серьезной проблемой при внедрении внедрения зависимостей IoC.
У меня есть приложение с двумя источниками данных, данные могут поступать из Solr или из базы данных.У меня есть 2 страницы, страница инвентаря, на которой отображаются все автомобили для дилера с двигателем quickSearch, который получает запросы от Solr, такие как Make, Model, ..., и отображает их в выпадающих списках, вторая страница - VehicleDetails, представляющая конкретное транспортное средство.плюс поиск, такой как Make, Model, но данные должны поступать из базы данных.
Я создал LookupServiceSolr и LookupServiceSQL, реализующие один интерфейс ILookupService в CastleControllerFactory:
_Container.Register(Component.For<MCI.Services.ILookupService>().ImplementedBy(typeof(MCI.Services.LookupServiceSQL)).Named("LookupSQL"));
_Container.Register(Component.For<MCI.Services.ILookupService>().ImplementedBy(typeof(MCI.Services.LookupServiceSolr)).Named("LookupSolr"));
InventoryController будет использоватьLookupServiceSolr и VehicleDetailsController будут использовать LookupServiceSQL, поэтому я зарегистрировал их следующим образом:
_Container.Register(Component.For<MCI.Presentation.Web.Controllers.InventoryController>().ServiceOverrides(ServiceOverride.ForKey("LookupService").Eq("LookupSolr")).LifeStyle.Is(LifestyleType.Transient));
_Container.Register(Component.For<MCI.Presentation.Web.Controllers.VehicleDetailsController>().ServiceOverrides(ServiceOverride.ForKey("LookupService").Eq("LookupSql")).LifeStyle.Is(LifestyleType.Transient));
и конструкторы InventoryController и VehicleDetailsController, имеющие LookupService в качестве параметра и все работающие нормально во время выполнения, что означает vehicleDetailsControllerиметь LookupService, реализованный LookupServiceSQL, и InventoryController будет иметь LookupService, реализованный LookupServiceSOlr.
У меня следующие вопросы: 1- Правильно ли я внедряю внедрение зависимостей IoC?2- Это мой главный вопрос, если у меня есть LookupController, у которого есть IlookupService в конструкторе, а у VehicleDetailsController есть LookupController в конструкторе, и я зарегистрировал их в контейнере следующим образом:
_Container.Register(Component.For<MCI.Services.ILookupService>().ImplementedBy(typeof(MCI.Services.LookupServiceSQL)).Named("LookupSQL"));
_Container.Register(Component.For<MCI.Services.ILookupService>().ImplementedBy(typeof(MCI.Services.LookupServiceSolr)).Named("LookupSolr"));
_Container.Register(Component.For<MCI.Presentation.Web.Controllers.LookupController>().ServiceOverrides(ServiceOverride.ForKey("lookupService").Eq("LookupSolr")).Named("Vehicle").LifeStyle.Is(LifestyleType.Transient));
_Container.Register(Component.For<MCI.Presentation.Web.Controllers.LookupController>().ServiceOverrides(ServiceOverride.ForKey("lookupService").Eq("LookupSQL")).Named("Details").LifeStyle.Is(LifestyleType.Transient));
_Container.Register(Component.For<MCI.Presentation.Web.Controllers.InventoryController>().ServiceOverrides(ServiceOverride.ForKey("lookupController").Eq("Vehicle")).LifeStyle.Is(LifestyleType.Transient));
_Container.Register(Component.For<MCI.Presentation.Web.Controllers.VehicleDetailsController>().ServiceOverrides(ServiceOverride.ForKey("lookupController").Eq("Details")).LifeStyle.Is(LifestyleType.Transient));
, так что на самом деле этомой поток и все работает нормально: InventoryController -> LookupController -> LookupServiceSolr.VehicleDetailsController -> LookupController -> LookupServiceSQL.
Моя проблема в том, что у меня есть Ajax-сообщение, Make dropdownList будет делать AJAX-сообщение об изменении и получать модель на основе make, я хочу вызвать метод вLookupController сразу же из представления и не проходит через vehicleDetailsController, который знает, что у моего lookupController есть LookupServiceSQL, я хочу, чтобы злоумышленник знал, что я хочу LookupServiceSQL, а не LookupServiceSolr.Есть ли способ сделать это или есть другая идея, чтобы решить эту проблему?
Пожалуйста, мне нужна помощь как можно скорее.
Заранее спасибо, Alaa