Внедрение нескольких провайдеров членства с помощью Structuremap - PullRequest
1 голос
/ 18 февраля 2010

У меня есть приложение ASP.NET MVC, и я использую StructureMap в качестве своего контейнера IOC. В настоящее время, когда контроллеру требуется IMembershipProvider, я использую StructureMap для внедрения конкретного экземпляра в конструктор контроллера на основе конфигурации BuyerMembershipProvider из моего файла web.config, как показано в приведенном ниже коде решения:

ObjectFactory.Initialize(x =>
{
        x.ForRequestedType<IMembershipService>().TheDefaultIsConcreteType<AccountMembershipService>();
    x.ForRequestedType<IFormsAuthentication>().TheDefaultIsConcreteType<FormsAuthenticationService>();
    x.ForRequestedType<MembershipProvider>().TheDefault.IsThis(SecurityProvider.Providers["BuyerMembershipProvider"]);
});

Это отлично работает. Однако он привязан к типу пользователя «покупатель». Информация о продавце хранится в другой базе данных и будет иметь разные таблицы для хранения информации о членстве. По сути, я хотел бы иметь возможность внедрить либо BuyerMembershipProvider, либо поставщика SellerMembership в зависимости от контекста и иметь следующую информацию в моей объектной фабричной инициализации:

x.ForRequestedType<MembershipProvider>().TheDefault.IsThis(SecurityProvider.Providers["BuyerMembershipProvider"]);
x.ForRequestedType<MembershipProvider>().TheDefault.IsThis(SecurityProvider.Providers["SellerMembershipProvider"]);

Можно ли выбирать между двумя конкретными реализациями при инициализации фабрики объектов?

Любая помощь очень ценится, Заранее спасибо! JP

Ответы [ 2 ]

2 голосов
/ 19 февраля 2010

Вы можете определить фабричное лямбда-выражение, которое будет принимать решение во время выполнения.

var securityProviderName = ConfigurationManager.AppSettings["securityProvider"];
bool requireBuyerProvider = (securityProviderName == "Buyer");

ObjectFactory.Initialize(x =>
{
    x.For<MembershipProvider>().Use(c=>
    {
        if (requireBuyerProvider)
            c.GetInstance<SellerMemberShipProvider>();
        else
            c.GetInstance<BuyerMembershipProvider>();
    });
});
1 голос
/ 18 февраля 2010

Основные механизмы выбора между различными реализациями будут через

  • именованный экземпляр
  • выбор определенной зависимости ctor
  • условное выражение в StructureMap.

Вы не можете указать 2 значения по умолчанию для данного типа (что должно быть очевидным), но вы можете назвать экземпляр и сказать, при каких обстоятельствах вы хотите его использовать.

Именованный экземпляр определен, например, как это:

InstanceOf<IApplicationModule>()
  .Is.OfConcreteType<BusinessProcessSupport>()
  .WithName("BusinessProcessSupport");

Вот пример, где именованный экземпляр используется для выполнения определенной зависимости ctor:

ForRequestedType<MenuStripModule>()
  .CacheBy(InstanceScope.Singleton)
  .TheDefault.Is.OfConcreteType<MenuStripModule>()
  .CtorDependency<ICommandInfoProvider>()
    .Is(i => i.TheInstanceNamed("Functions"));

И, наконец, вы можете взглянуть здесь на (несколько неприятное) выражение StructureMap, которое использует условные возможности: http://realfiction.net/Content/Entry/142 Обратите внимание, что вы используете синтаксис StructureMap 2.5. *. 2.6. * Отсутствует, что изменило грамматику конфигурации, чтобы сделать ее более краткой и понятной.

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