作为一个新手,我尝试在VB.NET中创建一个用于学习目的的MVVM应用程序。
我有四层 - 每层都是一个单独的组件:
数据层类,负责访问数据库。此程序集已安装实体框架。数据层由逻辑层引用。
模型图层类,用于保存数据(实体),例如众所周知的产品,客户,订单等。模型层由Logic层和ViewModels引用。还不重要。
逻辑层类,用于做生意并告诉数据层做什么。逻辑层引用模型层和数据层。
ViewModels / Views图层(不重要)
数据层样本:
Public Class DataLayer
Inherits DBContext
Public Sub New(connectionString as String)
MyBase.New(connectionString)
End Sub
Public Function QueryDatabase As IEnumerable(Of T)
'Query the database
End Public
'other CRUD methods
End Class
逻辑层样本:
Imports Model
Public Class LogicLayer
Private _datalayer As DataLayer
Public Sub New()
Dim connectionString = GetConnectionStringFromXMLFile
_datalayer = new DataLayer(connectionString)
End Sub
Public Function QueryProducts As IEnumerable(Of Products)
Return _datalayer.QueryDatabase(Of Products)
End Function
'other Methods
End Class
运行应用程序时,我遇到一个例外,即Logic层需要对Entity Framework的引用。为什么这个?我想,数据层是访问数据库的层吗?
我是否真的必须在逻辑层程序集中安装Entity Framework?或者,在不安装实体框架的情况下访问逻辑层中的数据层的最佳做法是什么?
答案 0 :(得分:1)
您的DataLayer类继承自DbContext,它是EntityFramework程序集的类型。
我建议您首先在逻辑层(没有实体框架)中为数据层方法创建接口,然后使用EntityFramework在数据层中实现它们。
逻辑层
START -> END -> INFO2 -> INFO1
然后在数据层中,您只需实现逻辑层提供的接口 这将阻止您公开某些与数据访问相关的类型。
Public Interface ICustomerDataService
Function GetAll() As IEnumerable(Of Models.Customer)
Function GetById(id As Integer) As Models.Customer
End Interface
// Logic class depend only on interface
Public Class CustomerLogic
Private ReadOnly _dataService As ICustomerDataService
Public Sub New(dataService As ICustomerDataService)
_dataService = dataService
End Sub
Public Sub DoSomeLogicWithCustomer(id As Integer)
Dim customer = _dataService.GetById(id)
' do something with customer
End Sub
End Class