代码之家  ›  专栏  ›  技术社区  ›  JP.

使用结构映射插入多个成员身份提供程序

  •  1
  • JP.  · 技术社区  · 15 年前

    我有一个现有的ASP.NET MVC应用程序,正在使用结构映射作为我的IOC容器的选择。当前,当控制器需要IMembershipProvider时,我使用structureMap根据web.config文件中的BuyerMembershipProvider配置在控制器的构造函数中插入一个具体实例,如下解决方案代码所示:

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

    这个很好用。但是,它绑定到“买方”用户类型。卖家信息存储在不同的数据库中,并且将有不同的表来存储会员信息。本质上,我希望能够根据上下文注入BuyerMembershipProvider或SellerMembership Provider,并在我的ObjectFactory初始化中具有以下功能:

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

    初始化对象工厂时,是否可以在两个具体实现之间作出决定?

    非常感谢您的帮助, 事先谢谢! 日本药典

    2 回复  |  直到 15 年前
        1
  •  1
  •   flq    15 年前

    在不同实现之间选择的主要机制是

    • 命名实例
    • 选择特定的ctor依赖项
    • 结构映射中的条件表达式。

    对于给定的类型,您不能声明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"));
    

    最后,您可以在这里查看使用条件功能的(有点讨厌的)结构映射表达式: http://realfiction.net/Content/Entry/142 请注意,您使用的是structuremap 2.5.*语法。2.6.*指出了这一点,它修改了配置语法,使其更加简洁和切题。

        2
  •  2
  •   KevM    15 年前

    您可以定义一个工厂lambda表达式,该表达式将在运行时进行决策。

    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>();
        });
    });