MVVM逻辑层需要引用实体框架

时间:2016-11-08 20:59:11

标签: vb.net entity-framework mvvm

作为一个新手,我尝试在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?或者,在不安装实体框架的情况下访问逻辑层中的数据层的最佳做法是什么?

1 个答案:

答案 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