1

我似乎无法弄清楚如何使用 EntityFramework 引用另一个 dll(在同一解决方案中)中的类

错误 1 ​​找不到类型或命名空间名称“Animal”(您是否缺少 using 指令或程序集引用?)

如果我尝试添加引用,我会创建一个循环引用。

public class AnimalDBContext : DbContext
{
    public AnimalDBContext()
        : base()
    {

    }

    public DbSet<Animal> Animals { get; set; }

}

这是对我来说似乎更正确的版本。但它可能不会?

public class AnimalDBContext<TEntity> where TEntity  : DbContext
{
    public AnimalDBContext()
        : base()
    {

    }

    public DbSet<TEntity> Animals { get; set; }

}

这会导致以下编译器错误。

 AnimalDBContext < Animal > animal = new AnimalDBContext<Animal>();

Error   3   The type 'AnimalLibrary.Animals.Animal' cannot be used as type
parameter 'TEntity' in the generic type or method
ObjectSaver.AnimalDBContext<TEntity>'. There is no implicit reference conversion from
AnimalLibrary.Animals.Animal' to 'System.Data.Entity.DbContext'.    
4

1 回答 1

4

因此,如果我理解正确,您的“存储库”程序集引用了您的“域”程序集,这是有道理的,而您的“域”程序集引用了您的“存储库”程序集,但没有。

您的实体类不应引用用于创建它们的存储库,原因如下:

  • 正如您所发现的,它创建了一个循环依赖项
  • 它使模拟您的类以进行单元测试变得更加困难
  • 您的实体与一种类型的提供者绑定,因此将来很难更改提供者

将存储库上的依赖项从域移动到单独的程序集中。

根据您的评论,听起来您至少需要三个程序集-

  • A)数据访问,
  • B) 业务逻辑,以及
  • C) 领域类。

理想情况下,A 和 B 应该引用 C,但不能相互引用(反之亦然)。你的领域类不需要知道如何坚持自己——那是别人的责任。

可以从 A 引用 B,但这会阻止您“模拟”您的存储库来测试您的业务逻辑。绑定数据访问和业务逻辑将在您的主要应用程序引用的“服务”层中。同样,您可以将服务层和应用层捆绑在一起,但这也会增加耦合并降低可测试性。

于 2013-10-23T13:13:59.253 回答