T的通用集合,用于DbEntities的ICollection

时间:2018-07-06 15:31:16

标签: vb.net entity-framework collections generic-collections

情况-

将EF数据库实体以及其他数据库实体的集合作为导航属性,所有这些实体都不在项目外部公开。这些实体中的每一个都嵌套在基类中,这些基类允许公共读取和受保护的集访问Db实体的属性值,并且是业务层将使用的类。因此,这些基类也需要其Db实体的导航属性的集合。

我现在所拥有的-

我仍在研究如何使数据层与引用它的其他层交互。因此,我一直在尝试创建可以设置为等于Db实体的集合的集合类,并创建嵌套Db实体的基类的集合。然后,该集合通过一个接口以及基类。该接口可以访问某些集合类的自定义方法,例如接受DTO和预建的quire,但会隐藏任何Add方法。

问题-

我想为集合创建一个通用基类,但似乎找不到方法。我已经接近一些可行的方法,但它却丑陋而令人困惑。以下是我正在使用的内容的概述。实体类中的缩小运算符可以很好地工作。我宁愿在基类中使用扩展运算符,也可以在基类中缩小运算符,以便可以将New方法保留为基类私有,但我不想在数据层之外公开实际的数据库实体。

解决方案中所有项目引用的Interops命名空间-

Public Interface IGenericEntity
End Interface

Public Interface INavigationPropertyEntity : Inherits IGenericEntity
End Interface

Public Interface IDbEntityToExposedEntityCollection(Of TEntity As IGenericEntity)
  'Used to hide Add method
End Interface

Public Interface IPublicEntity
  ReadOnly Property NavProps As IDbEntityToExposedEntityCollection(Of INavigationPropertyEntity)
End Interface

数据层项目-

-数据库实体

Friend Class DbEntity1
  Public Shared Narrowing Operator CType(ByVal value As DbEntity1) As NavigationPropertyEntity
    Return New NavigationPropertyEntity(value)
  End Operator
End Class

Friend Class DbEntity2
  Public Sub New()
    NavigationPropertyDbEntities = New HashSet(Of DbEntity1)
  End Sub

  Public Property NavigationPropertyDbEntities As ICollection(Of DbEntity1)

  Public Shared Narrowing Operator CType(ByVal value As DbEntity2) As PublicEntity
    Return New PublicEntity(value)
  End Operator

End Class

公开的基类

Public Class NavigationPropertyEntity : Implements INavigationPropertyEntity
  Private _value As DbEntity1

  Friend Sub New(value As DbEntity1)
    _value = value
  End Sub

End Class

Public Class PublicEntity : Implements IPublicEntity

  Dim _value As DbEntity2
  Friend _NavProps As DbEntityToPublicEntityCollection(Of INavigationPropertyEntity, DbEntity1, NavigationPropertyEntity)
  Public ReadOnly Property NavProps As IDbEntityToExposedEntityCollection(Of INavigationPropertyEntity) Implements IPublicEntity.NavProps
    Get
      Return _NavProps
    End Get
  End Property

  Friend Sub New(value As DbEntity2)
    _value = value
    _NavProps = new DbEntityToPublicEntityCollection(Of INavigationPropertyEntity, DbEntity1, NavigationPropertyEntity)(_value.NavigationPropertyDbEntities)
  End Sub

End Class

-特定于实体的集合

Friend Class DbEntityToPublicEntityCollection(Of IEnt As INavigationPropertyEntity, DbEnt As DbEntity1, ExpEnt As NavigationPropertyEntity)
  Inherits HashSet(Of IEnt)
  Implements IDbEntityToExposedEntityCollection(Of IEnt)

  Public Sub New(value As HashSet(Of DbEnt))
    For Each ent In value
      Dim exp As NavigationPropertyEntity = ent
      Dim i As INavigationPropertyEntity = exp
      MyBase.Add(i)
    Next

  End Sub


End Class

其他信息编辑

主要问题是能够使通用集合声明为类似的内容,

Friend Class DbEntityToPublicEntityCollection(Of IEnt, DbEnt as class, ExpEnt As class)

因为在New子ExpEnt中无法将其转换为DbEnt,而TryCast只会导致运行时错误。

就像我说的那样,我尝试设置由暴露类和实体类继承的类,因此可以设置一个带有暴露类参数的新方法,但是试图在其中拥有接口很快变得难以管理。再说一次,我之前没有做太多的工作来创建自己的泛型类型,所以我不确定这是否是正确的策略。

0 个答案:

没有答案