如何将MVC应用程序与不同类库中的成员关系提供程序和数据模型链接在一起

本文关键字:关系 成员 程序 在一起 链接 数据模型 MVC 应用程序 类库 同类 | 更新日期: 2023-09-27 17:50:46

我有3个类库和ASP.MVC 4 web应用程序。

  1. 库-基础数据模型(用户、角色等)
public class User
{
  public int ID { get; set; }
  public string Comments { get; set; }....
}
  • 库-扩展数据模型(合作伙伴,产品)-这可能因不同的web应用程序而异。
  • 图书馆-会员提供程序。
  • 我在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

    经过反复试验得到了这个的解决方案请随意评论——因为我不知道它有多正确。

    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; }
    }
    
  • 提供程序-关键是使其抽象
  • 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();
            }
        }
    }
    

    ,这是魔术:)

    如何将MVC应用程序与不同类库中的成员关系提供程序和数据模型链接在一起

    要使用通用库的用户权限和访问权限,您必须设计一个抽象层,该层将由您的会员提供者使用。由于DBContext直接连接到特定的业务领域,并且您希望使用通用库进行访问和授权,因此需要将项目的特定对象映射到该抽象层。我可以想象这样的抽象层应该允许以以下方式对实体(或标签)进行操作:

    1. 获取业务对象的特定实例
    2. 映射(或强制转换)到抽象层安全对象A
    3. 运行您的会员资格提供程序以在对象A上执行安全工作
    4. 使用输出决定任何操作(允许访问,限制访问)…