我是.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组合在一起吗?分裂它们有什么好处?
我很快就赶紧完成这个项目。所以我希望有人能尽快帮助我。谢谢你们。
答案 0 :(得分:1)
我认为您应该将数据层和服务层合并在一起。您在服务层中定义的GetAllBooks方法属于数据层。如果这代表了服务层中的其他方法,那么分离数据层和服务层可能没有多大价值。
我通常创建一个服务层(有时也称为应用层),使其位于业务层和数据层之上。它主要协调ui和业务/数据层之间的操作和请求。层之间的依赖关系如下:
HTH
答案 1 :(得分:0)
您必须将ConnectionString放入startup
项目中,大部分时间都是UI
层。
当你运行项目时,VS将其他层编译成dll并将这些dll放入bin folder
的启动项目中,并且不会有其他层的配置可用。
如果您的启动项目是Web应用程序,请将DataAccessContext
ConnectionString放入web.config
文件,或将Windows应用程序放入app.config
文件。