3 つのクラス ライブラリとASP.MVC 4
Web アプリケーションがあります。
- ライブラリ - 基本データ モデル (ユーザー、ロールなど)
public class User
{
public int ID { get; set; }
public string Comments { get; set; }....
}
- ライブラリ - 拡張データ モデル (パートナー、製品) - これは Web アプリによって異なる場合があります。
- ライブラリ - メンバーシップ プロバイダー。
現在のアプリに必要な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
プロパティを持つ任意のものにすることができます。Users
User
いくつかの試行錯誤の後、これに対する解決策が得られました 。お気軽にコメントしてください。それがどれほど正しいかわかりません。
- クラス ライブラリ
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; }
}
- プロバイダー - 鍵は抽象化することでした
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;
}
- 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();
}
}
}
そしてそれは魔法でした:)