繁体   English   中英

连接字符串和多个项目?

[英]Connection strings and multiple projects?

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

项目:

LM.Api <-是一个Web API项目

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

LM.DataAccess <-是一个包含模型,数据上下文和存储库的类库(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项目中,所以我应该为该项目启用迁移,对吗?

您绝对应该设计解决方案,以便只有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项目?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM