连接字符串和多个项目?

时间:2014-11-12 21:18:16

标签: c# database entity-framework ef-code-first entity-framework-6

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

项目:

LM.Api < - 是一个web api项目

LM.Console < - 是一个控制台项目

LM.DataAccess < - 是一个包含模型,datacontext和存储库的类库(LM.Api和LM.Console引用此项目)

我的问题是:

我如何为LM.Api和LM.Console创建一个公共数据库?

我在LM.DataAccess中放了一个包含连接字符串的静态字符串。 LM.Api和LM.Console都得到了这个并将其保存在各自的web.config / app.config文件中。

这是正确的做法吗? 当我从任一项目访问存储库时,我得到了异常:

The underlying provider failed on Open

另外,我假设.mdf文件应该放在LM.DataAccess项目中,所以我应该为该项目启用迁移,对吗?

1 个答案:

答案 0 :(得分:1)

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

但是(这很重要)存储库实现在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项目?

我总是使用Inversion of control-container来通过构造函数注入提供所需的接口,因为它使事情变得如此简单。 (Autofac是我的最爱,但还有其他几个)