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

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

我的项目(使用 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 项目需要连接字符串和任何特定的数据库知识。这可以通过抽象出对存储库接口(interface)的数据访问来实现。这些接口(interface)是您应用程序业务逻辑的一部分,因此它们应该在 LM.Api 中声明(或者实际上是在 LM.BusinessLogic 项目中声明,因为您可能还想从其他项目访问业务逻辑)。

但是(这很重要)存储库实现是在 LM.DataAccess 项目中声明的。所以,在 LM.BusinessLogic 中你有接口(interface):

interface ICustomerRepository
{
    void Insert(Customer customer);
    void Update(Customer customer);
    void Delete(int customerId);   
}

您的业务逻辑的所有其他部分仅在访问客户数据时与此接口(interface)通信。

在 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
}

然后是将接口(interface)和实现绑定(bind)在一起的棘手部分。你不能在两个方向上都有引用,并且由于 LM.DataAccess 必须有对 LM.BusinessLogic 的引用(它实现了在那里声明的存储库接口(interface)),解决这个问题的最简单方法是将它们绑定(bind)在一个单独的项目中,可以是依赖于两者。我认为,在您的情况下,这将是 LM.Api 项目。也许还有 LM.Console 项目?

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

关于c# - 连接字符串和多个项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26896756/

相关文章:

c# - 简化LINQ-使用两个不同的where子句的Col的总和两次

c# - 什么是 IExpando,它用在什么地方?

mysql - 找不到 phpmyadmin.conf 允许 IP 访问

entity-framework - 未看到 app.config/web.config 中的 Entity Framework DbContext 连接字符串

c# - AutoMapper.Collections.EntityFramework

c# - 强制转换为 IEnumerable<T>,其中 T 是运行时类型

c# - 在 C# 中为 SQLite 形成数据结构时遇到问题

sql - 更改表的物理结构 Oracle 11gr2

django - 将 postgres 转储迁移到 RDS

c# - 实现返回从 EF 实体映射的域模型的 Repository<T>