我当前正在设计一个使用实体框架5(.net 4)作为其数据访问策略的n层解决方案,但是我担心如何合并依赖项注入以使其可测试/灵活。
我当前的解决方案布局如下(我的解决方案称为Alcatraz):
Alcatraz.WebUI:一个asp.net Webform项目(前端用户界面)引用项目Alcatraz.Business和Alcatraz.Data.Models。
Alcatraz.Business:一个类库项目,包含业务逻辑,引用项目Alcatraz.Data.Access,Alcatraz.Data.Models
Alcatraz.Data.Access:一个类库项目,包含AlcatrazModel.edmx和AlcatrazEntities
DbContext,引用项目Alcatraz.Data.Models。
Alcatraz.Data.Models:一个类库项目,包含Alcatraz模型的POCO,无引用。
我对这个解决方案如何工作的愿景是,Web-ui将实例化业务库中的存储库,该存储库将具有(通过构造函数)连接字符串(而不是AlcatrazEntities
实例)的依赖项。Web用户界面会知道数据库连接字符串,但不知道它是一个实体框架连接字符串。
在业务项目中:
public class InmateRepository : IInmateRepository
{
private string _connectionString;
public InmateRepository(string connectionString)
{
if (connectionString == null)
{
throw new ArgumentNullException("connectionString");
}
EntityConnectionStringBuilder connectionBuilder = new EntityConnectionStringBuilder();
connectionBuilder.Metadata = "res://*/AlcatrazModel.csdl|res://*/AlcatrazModel.ssdl|res://*/AlcatrazModel.msl";
connectionBuilder.Provider = "System.Data.SqlClient";
connectionBuilder.ProviderConnectionString = connectionString;
_connectionString = connectionBuilder.ToString();
}
public IQueryable<Inmate> GetAllInmates()
{
AlcatrazEntities ents = new AlcatrazEntities(_connectionString);
return ents.Inmates;
}
}
在Web UI中:
IInmateRepository inmateRepo = new InmateRepository(@"data source=MATTHEW-PC\SQLEXPRESS;initial catalog=Alcatraz;integrated security=True;");
List<Inmate> deathRowInmates = inmateRepo.GetAllInmates().Where(i => i.OnDeathRow).ToList();
我对此设计有一些相关的问题。
就实体框架功能而言,这种设计甚至有意义吗?我听说实体框架已经使用了工作单元模式,是否只是在不必要地添加了另一层抽象?
我不希望我的Web用户界面直接与Entity Framework进行通信(或什至引用它),我希望所有数据库访问都通过业务层,因为将来我将有多个使用同一业务层的项目(Web服务,Windows应用程序等),我想通过在一个中央区域中放置业务逻辑来轻松维护/更新。这是实现此目标的合适方法吗?
业务层应该包含存储库,还是应该包含在访问层中?如果它们在哪里,那么传递连接字符串是否是一个很好的依赖关系?
感谢您抽出宝贵的时间阅读!
DbContext
作为其依赖项。业务类具有存储库作为依赖项。对于依赖项注入,我正在手动执行此操作(因此我了解发生了什么)。我希望能够在上设置连接字符串的原因DbContext
是我使用数据库分片,因此在某些情况下,我需要具有实体框架才能连接到不同的数据库(具有相同的结构)。我能正确理解你吗?