需要帮助使用Abstract Classes和Generics

时间:2015-12-10 19:00:16

标签: asp.net-mvc vb.net

我正在尝试为我所有的mvc-5项目构建一个类库。对于那个任务,我开始为我的DB Context和Indentity User设置一些抽象类,就像这样

Public MustInherit Class ApplicationUserAbstract
    Inherits IdentityUser

End Class

Public MustInherit Class DatabaseContextAbstract
    Inherits DbContext

    Public Property Users as DBSet(of ApplicationUserAbstract)


    Sub New()
        MyBase.New()
    End Sub

    Public Sub New(nameOrConnectionString As String)
        MyBase.New(nameOrConnectionString)
    End Sub

    Protected Overrides Sub OnModelCreating(modelBuilder As DbModelBuilder)
        MyBase.OnModelCreating(modelBuilder)


    End Sub
End Class

我认为我必须采用另一种方法将DatabaseContextAbstract.Users设置为正确的类,其中包含类似于ApplicationUserAbstract的T。有什么消息吗?我不知道如何将此传递给用户,除了使用像

这样的东西
Public MustInherit Class DatabaseContextAbstract(of T as ApplicationUserAbstract)
    Inherits DbContext

    Public Property Users as DBSet(of T)

End Class

我的下一个问题:如何在抽象类中访问当前的DatabaseContextAbstract实例? DatabaseContextAbstract的所有方法(DatabaseContextAbstract(......都是废话......)

编辑:

这背后的基本思想是在那个抽象类中打包表和函数。例如在我的所有项目中,每个ApplicationUser后面都有相同的UserRight和Group Tables。但是每个项目可能还有基表的项目特定表。每个项目中仍然只有一个应用程序用户。

1 个答案:

答案 0 :(得分:1)

我没有看到你在这里做的很多事情。 IdentityUser已经是抽象的。你打算创建一个继承它的具体类。如果您打算让多个不同类型的用户都共享自定义属性的某些子集,我可以看到可能添加一个实现这些属性的IdentityUser的抽象子类,但是您在这里没有这样做。但是,即使你这样做,Identity的用户也有点特殊。您只能有一个用户表,因此继承必须从具体的基类开始,无论如何。例如,以下内容可以正常工作:

public class ApplicationUser : IdentityUser {}
public class FooUser : ApplicationUser {}
public class BarUser : ApplicationUser

这将工作:

public abstract class ApplicationUserAbstract : IdentityUser {}
public class FooUser : ApplicationUserAbstract {}
public class BarUser : ApplicationUserAbstract {}

在第二种情况下,FooUserBarUser将获得单独的表,Identity不支持这些表。在第一个场景中,将使用单表继承,因此FooUserBarUser将与ApplicationUser在同一个表中,并带有一个鉴别器列。

当涉及到你的上下文时,再次,有一个基本的抽象上下文类的实用性有限。上下文固有地与数据库相关联,并且将多个上下文与其自己的唯一数据库进行交互没有任何意义,这些数据库实际上都是碳复制。即使您正在处理多租户应用程序,您也只需要一个上下文。数据库的个性化将通过连接字符串处理,而不是使用哪个上下文类。

最后,如果您使用的是身份证明,则您的上下文应该继承自IdentityDbContext,而不是DbContext。除其他事项IdentityDbContext已经包含了DbSet用户,因此您添加的是不必要的。

长而短,这些代码都没有为应用程序做任何事情。为了抽象,这是毫无意义的抽象。