[英]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.