我的项目(使用 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/