1

我有一个现有的 ASP.NET MVC 应用程序,并且正在使用 StructureMap 作为我选择的 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"]);

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

非常感谢任何帮助,在此先感谢!J.P

4

2 回答 2

2

你可以定义一个工厂 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>();
    });
});
于 2010-02-18T23:58:30.777 回答
1

在不同实现之间进行选择的主要机制是通过

  • 命名实例
  • 选择某个 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.*出来了,修改了配置语法更加简洁明了。

于 2010-02-18T16:22:08.517 回答