2012-10-27 8 views
6

コードをApp_Codeからクラスライブラリに移動する処理中です。クラスライブラリのMembership.CreateUser()

Membership.CreateUserを使用してプログラムでユーザーを作成します。

私はweb.configに設定したメンバーシッププロバイダにアクセスできないクラスライブラリ内でこれをやり続けますか?

+0

asp.netアプリケーションにクラスがありますが、web.configの情報にアクセスできません。独自のweb.configを持つフォルダにありますか? – Paparazzi

答えて

0

クラス内のSystem.Web.Security名前空間にusingディレクティブを追加すると、Membershipクラスに直接アクセスできます。

C#:

using System.Web.Security; 

VB.NET:

Imports System.Web.Security 
+0

既にメンバーシップクラスにアクセスできます。クラスライブラリ内ではweb.configを読み取ることができないため、web.configファイルで設定したSQL Severではなく、デフォルトのプロバイダを使用しているようです。 – Chris

+0

@Chris - クラスライブラリは何らかのコンテキストで動作します。クラスライブラリは、実行されるアプリケーションの設定にアクセスします。 – Oded

+0

私のクラスライブラリの中で、私は 'MembershipUser NewUser = Membership.CreateUser(userName、password、email、"無回答 "、"無回答 "、true、out createStatus); パスワードを" wonder123" 、これがデフォルト(なし非アルファ)によって許容可能ではなく、アプリケーションのweb.configファイルは、このあります '<会員defaultProvider = "MyProviderを"> \t \t \t \t \t \t \t < \tを追加\t \t \t name = "MyProvider" ** minRequiredNonalphanumericCharacters = "0" ** ...\t \t \t \t /> \t \t \t \t \t ' その上記を読んだのであれば、それは代わりに私がcreateStatus.InvalidPasswordを取得し、パスワードとして "wonder123" を受け入れるだろう。 – Chris

0

あなたはメンバーシップクラスbecouseどこでもアクセスできるASP.NETプロバイダシステムによってsetted現在のプロバイダの静的な表現です。

1

私はapp.configにweb.config全体をコピーすることで問題を解決しました。私はコンソールアプリケーションを使用していました。私は必要なセクションをコピーしたと思ったが、すべてをコピーするまで、データはデータベースに到達していなかった

4

コードパートの仕組みを説明する前に、このようなシナリオでどのように設定が読み込まれるかを理解する必要がある。

あなた.dllファイルをロードしようとしているWebアプリケーションがある - と.dllファイルは、アプリケーションが構成されているMembershipProviderにアクセスしようとしていること - あなたは、いくつかの仮定を行う必要があります。

  1. は、Webアプリケーションは、あなたの.dll正しく

があなたの.dllファイルに含まれなければならないのでロードMembershipProvider

  • Webアプリケーションは、そのWeb.Config
  • WebアプリケーションでそのMembershipProviderの設定を提供していますWebアプリケーションの/binディレクトリにアクセスするには、Webアプリケーションの構成に依存する必要がありますを提供する必要はありません。

    これを行うには、オデッドは彼の答えに言及するもので始まる - そのファイルの中に次のような何かすることができます - あなたの.dllのコードが内System.Web.Securityへの参照を作成します。このとき

    if (Membership.Provider != null) { 
        Membership.Provider.CreateUser(...); 
    } else { 
        // Do something appropriate in a case where there is no Membership Provider 
    } 
    

    をポイント - 上記がうまくいかない場合は、Webアプリケーションに適切なプロバイダが設定されていない可能性があります。

    、このようにそれを行うにはなぜ上のノート...あなたはWebアプリケーションの設定を提供させてください

    理由はSeparation of Concernsの原則を遵守することです。MembershipProviderは、実装がほとんどなく、デフォルトの機能を提供する抽象クラスです。

    つまり、メンバを管理するには、CreateUser()GetAllUsers()などの操作を実行できる必要があります。また、PasswordFormatを指定し、各ユーザーがRequiresUniqueEmailかどうかを判断するなど、設定を構成できるようにする必要があります。

    あなたのユーザー情報をどこに保存するかは教えてください。これは、実装者(System.Web.Providers.DefaultMembershipProviderまたはYourNS.YourMembershipProvider)に任せます。

    MembershipProviderを使用するアプリケーションは、提供する設定と使用する実装を決定します。言い換えれば、情報の管理方法を指定するのはYourNS.YourMembershipProviderの仕事ですが、そのストレージなどで何を使用するかを決定する必要があります。

    したがって、上記のパターンに従って、 MembershipProviderを消費するアプリケーション、

  • MembershipProvider実装を提供アセンブリ、及びいずれを使用
  • アセンブリ

    1. :3つの別々の層を提供10が設定されている - あなたが今MembershipProvidersを切り替えることができます - とアプリケーションの代わりにそれで何かをあなたがこのパターンに従うならばという

    お知らせ(*これは、私は信じて、あなたの記事で記述している層です)後でのいずれかの他のレイヤーを変更する必要はありません。 - 特定の実装に頼るのではなく、これらのレイヤーが基本クラスMembershipProviderに依存しているためです。これは非常に貴重です。

  • +1

    お返事ありがとう – codingbiz

    +0

    おめでとうございました。 :)私はさまざまなプロジェクトでこれを何度もやらなければなりませんでした。動きのある部分を理解するために、最初の数回はどれほどイライラしたのか覚えています。 –

    関連する問題