2013-01-02 104 views
1

存在架构问题。我试图将逻辑层分成物理层,并且遇到一些麻烦。这里是我想要的东西设置的方式:实体框架和N层

  • 实体 - 一个DLL。我的POCO课程。没有任何倾向。
  • DAL - 一个DLL。包含模型和DbContext。依赖于实体。
  • BLL - 一个DLL。包含CRUD功能。依赖于DAL和实体
  • 用户界面 - 一个网站项目。对BLL说话。

我的问题是,在BLL,我做这样的事情:

''' <summary> 
''' The repository 
''' </summary> 
''' <remarks></remarks> 
Private context As MyContext 

''' <summary> 
''' Instantiate the business layer 
''' </summary> 
''' <remarks></remarks> 
Public Sub New() 
    context = New MyContext() 
End Sub 

''' <summary> 
''' Insert a general retrieve into the database 
''' </summary> 
''' <param name="myEntity">The entity to insert</param> 
''' <returns>The id of the entity added</returns> 
''' <remarks></remarks> 
Public Function Create(ByVal myEntity As myEntity) As String 
    Try 
     context.myEntity.Add(myEntity) 
     context.SaveChanges() 
    Catch ex As Exception 
     Throw ex 
    End Try 
    Return myEntity.id 
End Function 

但为了呼吁加入我的实体,我需要的EntityFramework.dll参考,因为我的背景下,从继承的DbContext 。我没有看到如何避免这种情况,而无需创建一个存储库,这看起来像是一个不必要的额外抽象层,再加上我认为我不需要使用DbContext。

我在这里错过了什么?

回答

1

您的DAL可以定义由您的派生环境和工厂为您的环境实现的接口。 BLL将只使用接口和工厂。

+0

对不起,我需要更详细一点。我不确定我是否理解你所引用的所有概念。 –

+0

因此,如果我的上下文被称为myDbContext,它从DbContext继承,我应该有一个ImyDbContext,并且实际上下文继承自DbContext并实现ImyDbContext。我必须在早上尝试并实施这一点。 –

+0

我被困在这里。我创建了一个接口,但接口依然依赖于IDbSet,这需要业务层中的EntityFramework DLL。 –

1

如果你被困在这个题目,你应该看看CodePlex上可用的N层实体框架:http://ntieref.codeplex.com/

+0

我已经研究出了如何做到这一点,但肯定会看看该项目来帮助清理。 –