0

3 つのクラス ライブラリとASP.MVC 4Web アプリケーションがあります。

  1. ライブラリ - 基本データ モデル (ユーザー、ロールなど)
public class User
{
  public int ID { get; set; }
  public string Comments { get; set; }....
}
  1. ライブラリ - 拡張データ モデル (パートナー、製品) - これは Web アプリによって異なる場合があります。
  2. ライブラリ - メンバーシップ プロバイダー。

現在のアプリに必要なDBContextものを知っているのはMVCアプリだけなので、MVCアプリで作成します。DBSet

public class DSContext:DbContext
{
   public DbSet<User> Users { get; set; }
}

MVCアプリの両方のデータライブラリからモデルにアクセスして使用できます(そして機能します)が、 MVCアプリで使用membership providerするものと同じDBContextものを次のように使用する方法を教えてください。

var pUser = SomeDBContext.Users.Find(Username);
return new MembershipUser(...Set properties from pUser...);

SomeDBContextファースト クラス ライブラリのタイプのDbContextプロパティを持つ任意のものにすることができます。UsersUser

いくつかの試行錯誤の後、これに対する解決策が得られました 。お気軽にコメントしてください。それがどれほど正しいかわかりません。

  1. クラス ライブラリ
public class User
{
   [Required]
   [Key]
   public string UserName{get; set;}
   public string PassWord{ get; set;}
}

public class UserContext : DbContext
{
   public DbSet<User> Users { get; set; }
}
  1. プロバイダー - 鍵は抽象化することでした
public abstract class STMembershipProvider : ExtendedMembershipProvider

そして抽象プロパティを追加する

public abstract CL.UserContext DB { get; }

public override bool ValidateUser(string username, string password)
{

    User dbuser = DB.Users.Find(username);

    if (dbuser != null)
    {
        if (dbuser.PassWord == password) return true;
    }
    return false;
}
  1. MVC アプリケーションDbContextでは、クラス ライブラリから継承するものをローカルに作成し、ライブラリ内DbContextで継承するローカル プロバイダーを作成MembershipProviderします。
public class EFContext:CL.UserContext
{

}

public class LocalMp:MP.STMembershipProvider
{
    public override CL.UserContext DB
    {
        get
        {
            return new EF.Models.EFContext();
        }
    }
}

そしてそれは魔法でした:)

4

1 に答える 1

0

ユーザー権限とアクセスに一般的なライブラリを使用するには、メンバーシップ プロバイダーが使用する抽象レイヤーを設計する必要があります。DBContext は特定のビジネス ドメインに直接接続されており、アクセスと承認のために一般的なライブラリを使用したいので、プロジェクトの特定のオブジェクトをその抽象レイヤーにマップする必要があります。このような抽象レイヤーは、次の方法でエンティティ (またはテーブル) を操作できるようにする必要があると想像できます。

  1. ビジネス オブジェクトの特定のインスタンスを取得する
  2. 抽象層セキュリティ オブジェクト A にマップ (またはキャスト) します。
  3. メンバーシップ プロバイダーを実行して、オブジェクト A のセキュリティ作業を行います
  4. 出力を使用してアクションを決定します (アクセスを許可する、アクセスを制限する)...

これが役立つことを願っています。

于 2013-01-06T12:07:20.523 に答える