1

既存のASP.NETMVCアプリケーションがあり、選択したIOCコンテナーとしてStructureMapを使用しています。現在、コントローラーに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のいずれかを挿入できるようにし、オブジェクトファクトリの初期化に次のようにします。

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

オブジェクトファクトリを初期化するときに、2つの具体的な実装のどちらかを決定することは可能ですか?

どんな助けでも大歓迎です、事前に感謝します!JP

4

2 に答える 2

2

You could define a factory lambda expression which will do your deciding at runtime.

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"));

And finally you can have a look here at a (somewhat nasty) StructureMap expression that uses the conditional capabilities: http://realfiction.net/Content/Entry/142 Please note that you are using the StructureMap 2.5.* syntax. 2.6.* is out which has modified the configuration grammar to be more concise and to the point.

于 2010-02-18T16:22:08.517 に答える