如何将MVC应用程序与不同类库中的成员关系提供程序和数据模型链接在一起
本文关键字:关系 成员 程序 在一起 链接 数据模型 MVC 应用程序 类库 同类 | 更新日期: 2023-09-27 17:50:46
我有3个类库和ASP.MVC 4
web应用程序。
- 库-基础数据模型(用户、角色等)
public class User
{
public int ID { get; set; }
public string Comments { get; set; }....
}
- 库-扩展数据模型(合作伙伴,产品)-这可能因不同的web应用程序而异。
- 图书馆-会员提供程序。
- 类库
- 提供程序-关键是使其抽象
- 在MVC应用程序中创建从类库
DbContext
继承的本地DbContext
和从库中继承MembershipProvider
的本地提供者。
我在MVC应用程序中创建了我的DBContext
,因为只有在那里我知道当前应用程序需要哪个DBSet
。
public class DSContext:DbContext
{
public DbSet<User> Users { get; set; }
}
我可以访问和使用模型从两个数据库在MVC应用程序(它的工作原理),但如何告诉membership provider
使用相同的DBContext
,我在MVC应用程序中使用像这样的东西?
var pUser = SomeDBContext.Users.Find(Username);
return new MembershipUser(...Set properties from pUser...);
SomeDBContext
可以是一级库中具有Users
属性且类型为User
的任意DbContext
。
经过反复试验得到了这个的解决方案请随意评论——因为我不知道它有多正确。
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;
}
public class EFContext:CL.UserContext
{
}
和
public class LocalMp:MP.STMembershipProvider
{
public override CL.UserContext DB
{
get
{
return new EF.Models.EFContext();
}
}
}
,这是魔术:)
要使用通用库的用户权限和访问权限,您必须设计一个抽象层,该层将由您的会员提供者使用。由于DBContext直接连接到特定的业务领域,并且您希望使用通用库进行访问和授权,因此需要将项目的特定对象映射到该抽象层。我可以想象这样的抽象层应该允许以以下方式对实体(或标签)进行操作:
- 获取业务对象的特定实例
- 映射(或强制转换)到抽象层安全对象A
- 运行您的会员资格提供程序以在对象A上执行安全工作
- 使用输出决定任何操作(允许访问,限制访问)…