7

ASP.NET MVC 1.0 プロジェクト テンプレートには、AccountControllerコンストラクター インジェクションをサポートするクラスが含まれています。

public AccountController(IFormsAuthentication formsAuth, 
    IMembershipService service)
{
    FormsAuth = formsAuth ?? new FormsAuthenticationService();
    MembershipService = service ?? new AccountMembershipService();
}

AccountMembershipServiceクラスも含まれており、コンストラクター注入もサポートしています。

public AccountMembershipService(MembershipProvider provider)
{
    _provider = provider ?? Membership.Provider;
}

多くの方が単体テストにこれらを使用したことがあると思いますが、私の目標は、SqlMembershipProviderWindsor を使用して を挿入し、web.config ではなく Windsor XML ファイルを使用して実行時に構成することです。つまり、classにコンストラクター インジェクションをAccountMembershipService使用し、組み込みの ASP.NET 2.0 メンバーシップ システムを引き続き使用したいと考えています。メンバーシップ システムの構成が Windsor IoC を通過するようにしたいだけです。

これは、独自の MembershipProvider を作成せずに可能ですか、それともSqlMembershipProviderIC でうまく機能しませんか?

MSDN から:「SqlMembershipProvider コンストラクターは、ASP.NET によって呼び出され、アプリケーションの構成で指定された SqlMembershipProvider クラスのインスタンスを作成します。このコンストラクターは、コードから使用することを意図していません。」

Phil が非常によく似た質問をしたと思います。彼が受け取った回答は次のとおりです。

ご協力いただきありがとうございます。


更新: 明確にするために、アプリケーションの MembershipProvider を DI 経由で供給する理由は、複数のテナントをサポートするためです。各テナントには、ASP メンバーシップ テーブルを含む分離されたデータベースがあります。DI を使用すると、実行時に接続文字列を切り替えることができるため、コア アプリケーションは、各テナントで使用されているデータベースに依存しません。Windsor は DI を制御しており、どのテナントが URL 経由でリクエストを行っているかを「認識」しています。
var url = HttpContext.Current.Request.ServerVariables["HTTP_HOST"]

Mike Hadlowがこのテクニックについて書いています。私はちょうどSqlMembershipProvider彼のこの IoC 設計の使用に統合しようとしています。

4

1 に答える 1

3

メンバーシップ プロバイダーが次のように構成されていると仮定します。

<membership>
    <providers>
        <clear/>
        <add name="www.tenant1.com" 
         type="System.Web.Security.SqlMembershipProvider, ..." 
         .../>
        <add name="www.tenant2.com" 
         type="System.Web.Security.SqlMembershipProvider, ..." 
         .../>
    </providers>
</membership>

次のように、ウィンザーに適切なプロバイダーを選択させることができます。

var container = new WindsorContainer();
container.AddFacility<FactorySupportFacility>();
container.Register(Component.For<MembershipProvider>()
    .LifeStyle.Transient
    .UsingFactoryMethod(() => Membership.Providers[HttpContext.Current.Request.Url.Host]));
... (your controller registrations, etc)
于 2009-05-29T01:56:50.410 に答える