我的项目(使用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项目中,所以我应该为该项目启用迁移,对吗?
答案 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是我的最爱,但还有其他几个)