Инъекция зависимости IoC, определяющая класс из Ajax - PullRequest
0 голосов
/ 05 июля 2011

Я новичок в 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

1 Ответ

0 голосов
/ 10 апреля 2012

Я думаю, вы немного переоцениваете это.Вместо того, чтобы настраивать LookupController для вставки одной зависимости для LookupService (один набор условий для LookupSolr и другой для LookupSql), почему бы не внедрить оба LookupServices в ваш контроллер, а просто использовать тот, который соответствует вашим действиям или параметрам?

Измените регистрационные ключи на что-то вроде:

ServiceOverride.ForKey("lookupServiceSolr").Eq("lookupSolr"),
ServiceOverride.ForKey("lookupServiceSQL").Eq("lookupSQL"),

... тогда вы можете использовать его немного проще:

public class LookupController : ControllerBase
{
    ILookupService LookupServiceSolr= null;
    ILookupService LookupServiceSQL= null;

    public LookupController(ILookupService lookupServiceSolr, ILookupService lookupServiceSQL)
    {
        LookupServiceSolr= lookupServiceSolr;
        LookupServiceSQL= lookupServiceSQL;
    }

    // then use the one you want based on parameters or type of call

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