这是一个问题,假设我有两个项目:
在DataAccess项目中,有一个继承自DbContext
的DataContext类using (var context = new DataContext ()){...}
在Application项目中,我添加了DataAccess引用,并在main方法中添加了以下语句:
DbContext
但是Resharper秀
类型{{1}}在未引用的程序集中定义。
为什么我需要再次添加相同的程序集?
为什么我无法从DataAccess.dll获取DbContext定义?
(DataAccess项目已通过NuGet添加了EntityFramwork.dll)
编辑1:当一个类型继承了另一个类型(例如:继承自DbContext的DataContext)时,为什么编译器没有在同一个dll中包含DbContext的定义,所以在另一个项目中,我们只需要添加引用对孩子类型的dll?
答案 0 :(得分:3)
因为您的类库(.dll
)没有包含'它的依赖集合。因此,如果想要使用类库,那么执行程序集也需要引用依赖程序集。
(它与配置文件有点相同,它们也没有嵌入,所以即使你有类库的配置文件中定义的连接字符串,你仍然需要定义它也会进入你的初创应用程序。)
如果您真的想将库嵌入到单个dll中,可以查看ILMerge,但建议您在启动应用程序中包含所需的所有库。
另一个好的(我可以推荐)是Costura.Fody。您只需要通过NuGet安装它,无需任何配置,下次构建应用程序时,它会将所有内容嵌入到您的类库中。
答案 1 :(得分:2)
因为您要访问的类型位于该程序集上。 因为您希望能够在该类型上定义变量。它就像:
DataContext dbContext = new DataContext();
dbContext.Users.ToList();
这是你想要在DAL使用的表示层中做的事情。但问题是你还在使用实体框架。 让我们在服务层上创建一个依赖于EntityFramework的函数。
List<User> GetUsers()
{
DataContext dbContext = new DataContext();
dbContext.Users.ToList();
}
现在我们可以简单地调用此服务和功能,而无需添加Entity Framework参考。那是因为;在表示层,我们现在与实体框架无关。我们只是在调用一个函数。但在您的情况下,您只是将实体框架与来自另一个项目的Context一起使用。这就是为什么你的代码需要EF refence而我的代码不是。 感谢名单