拆分DataAccess和服务层。缺少ConnectionStrings和引用

时间:2015-05-11 02:22:11

标签: c# entity-framework connection-string

我是.net开发的新手,我仍然面临着有关我的解决方案设计的一些问题。正如我在另一个问题中所提到的,我的整个解决方案目前分为3个项目:

1)DataAccessLayer - 实现实体框架。所有实体都在这里定义。此处还定义了DataConccessContext,它是dbContext的子类。 DataAccessContext的代码如下:

public class DataAccessContext : DbContext
{
    public DataAccessContext() : base("name=DataAccessContext")
    {
    }

2)ServiceLayer-实现UI和业务层的方法,以从localdb服务器访问实体。该层使用DataAcessLayer作为参考。

3)BusinessLayer-实现业务逻辑。使用ServiceLayer作为参考。

我遇到了两个我无法理解的问题:

1)在ServiceLayer中,当使用DataAccessContext的实例(来自DataAccessLayer)时,系统会要求我安装EntityFramework包。为什么这有必要?我的引用(DataAccessLayer)没有必要的包吗?

2)我试图在ServiceLayer中编写BusinessLayer可以调用的方法。代码如下所示:

using ModelDTO.Models;
using DataAccess.Models;

namespace DataAccessService
{
    public class Class1
    {
        DataAccessContext db = new DataAccessContext();

        public IQueryable<BooksDTO>GetAllBooks(){
            var books = from b in db.Books
                        select new BookDTO()
                        {
                            Id = b.Id,
                            Title = b.Title,
                            AuthorName = b.Author.Name
                         };
             return books;
         }

这里我收到一条错误消息,指出我的应用程序日志中没有定义连接字符串“DataAccessContext”。连接字符串再次出现在实现EntityFramework的DataAcessLayer中。那么我为什么需要在ServiceLayer项目中使用它呢?

如果我必须在ServiceLayer中输入ConnectionString,我应该简单地将DataAcessLayer和ServiceLayer组合在一起吗?分裂它们有什么好处?

我很快就赶紧完成这个项目。所以我希望有人能尽快帮助我。谢谢你们。

2 个答案:

答案 0 :(得分:1)

我认为您应该将数据层和服务层合并在一起。您在服务层中定义的GetAllBooks方法属于数据层。如果这代表了服务层中的其他方法,那么分离数据层和服务层可能没有多大价值。

我通常创建一个服务层(有时也称为应用层),使其位于业务层和数据层之上。它主要协调ui和业务/数据层之间的操作和请求。层之间的依赖关系如下:

  • ui引用了服务层
  • 服务层具有对业务和数据层的引用
  • 数据层具有对业务层的引用
  • 业务层不引用任何其他图层

HTH

答案 1 :(得分:0)

您必须将ConnectionString放入startup项目中,大部分时间都是UI层。

当你运行项目时,VS将其他层编译成dll并将这些dll放入bin folder的启动项目中,并且不会有其他层的配置可用。

如果您的启动项目是Web应用程序,请将DataAccessContext ConnectionString放入web.config文件,或将Windows应用程序放入app.config文件。