C# 连接字符串和多个项目?

C# 连接字符串和多个项目?,c#,database,entity-framework,ef-code-first,entity-framework-6,C#,Database,Entity Framework,Ef Code First,Entity Framework 6,我的项目(使用web api、EF6和localdb)的结构如下: 项目: LM.Api您应该明确设计您的解决方案,以便只有LM.DataAccess项目需要连接字符串和数据库的任何特定知识。这可以通过抽象出对存储库接口的数据访问来实现。这些接口是应用程序业务逻辑的一部分,因此它们应该在LM.Api中声明(或者实际上在LM.BusinessLogic项目中声明,因为您可能还希望从其他项目访问业务逻辑) 但是(这一点很重要)存储库实现是在LM.DataAccess项目中声明的。因此,在LM.Bus

我的项目(使用web api、EF6和localdb)的结构如下:

项目:


LM.Api您应该明确设计您的解决方案,以便只有LM.DataAccess项目需要连接字符串和数据库的任何特定知识。这可以通过抽象出对存储库接口的数据访问来实现。这些接口是应用程序业务逻辑的一部分,因此它们应该在LM.Api中声明(或者实际上在LM.BusinessLogic项目中声明,因为您可能还希望从其他项目访问业务逻辑)

但是(这一点很重要)存储库实现是在LM.DataAccess项目中声明的。因此,在LM.BusinessLogic中,您有一个接口:

interface ICustomerRepository
{
    void Insert(Customer customer);
    void Update(Customer customer);
    void Delete(int customerId);   
}
业务逻辑的所有其他部分仅在访问客户数据时与此接口通信

在LM.DataAccess中,您有具体的实现:

public class CustomerRepository : ICustomerRepository
{
    public void Insert(Customer customer)
    {
        using (var db = new DatabaseContext())
        {
            db.Customers.Add(customer);
            db.SaveChanges();
        }    
    }

    ... and so on
}
然后是将接口和实现捆绑在一起的棘手部分。您不能在两个方向上都有引用,而且由于LM.DataAccess必须有对LM.BusinessLogic的引用(它实现了在其中声明的存储库接口),克服这一问题的最简单方法是将它们绑定到一个独立的项目中,该项目可以依赖于这两个接口。在您的情况下,我认为这将是LM.Api项目。还有LM.Console项目


我总是使用控制反转容器通过构造函数注入来提供所需的接口,因为它使事情变得更容易。(这是我最喜欢的,但还有其他几种)

首先,感谢你给出了这么棒的答案!我不太明白的是,与直接在LM.DataAccess中调用存储库相比,使用这种方法的优势是什么?此外,在哪些项目中我需要连接字符串?我假设我在LM.Api和LM.Console中都需要一个连接字符串-对吗?这种方法的主要原因是遵循这种模式。如果您有一个管理所有数据库访问的项目,那么如果您的数据存储需要更改,您总是知道该去哪里。如果您像这样构建项目(业务逻辑只作用于LM.DataAccess中实现的接口),那么您只需要LM.DataAccess中的连接字符串。理想情况下,业务逻辑项目不应该确切地知道数据是如何存储的。
public class CustomerRepository : ICustomerRepository
{
    public void Insert(Customer customer)
    {
        using (var db = new DatabaseContext())
        {
            db.Customers.Add(customer);
            db.SaveChanges();
        }    
    }

    ... and so on
}