使用数据访问层安排3层的dotnet核心应用程序
我典型的.NET 4.5X Web应用程序结构至少包含3层:Web项目(.NET Web应用程序),域/业务逻辑项目(类库)和数据访问项目(类库)。 Web项目引用业务层,业务层引用数据访问层。
我喜欢这种方法,因为我的web项目没有对数据访问项目的引用(它必须首先通过域/业务逻辑层)。 我的Web项目不应该具有对上下文或存储库类的任何访问权限。
在3层.net 4.5.X应用程序中,我在web.config中声明连接字符串,并将DbContext的名称作为连接字符串的name属性。
在新的Dotnet Core范例中,我看到的每个示例都在Startup.cs中配置了DbContext,如下所示:
public void ConfigureServices(IServiceCollection services) { // Add framework services. services.AddMvc(); services.AddEntityFramework() .AddSqlServer() .AddDbContext("myconnectionstring or reference to it"); }
通过为启动提供一个用于dbcontext的具体类,我必须引用数据访问项目,其中定义了dbcontext。 我宁愿只引用中间层,并避免引用DAL。
我的问题是:我应该如何安排我的解决方案结构,以便我可以避免从我的Web项目添加引用到我的数据访问项目?
我可以使用appsettings.json属性吗?
我可以用另一种方式添加我的实体配置吗?
点网核心有什么重要的缺点吗?
先感谢您。
我找到了一个使用EF6和Dotnet Core的解决方案,我很满意。
它不使用service.AddSqlServer()调用EF7,而是使用EF6配置并在启动时调用的Bootstrap类中注册DbContext。
public static class BootstrapConfig { public static void RegisterApplicationServices(this IServiceCollection services, IConfigurationRoot configuration) { // DbContext services.AddScoped(x => new ApplicationContext(configuration["Data:ApplicationContext:ConnectionString"])); } }
这是从WebLibrary项目中的Startup.cs调用的
public void ConfigureServices(IServiceCollection services) { // Add framework services. services.AddMvc(); services.RegisterApplicationServices(Configuration); }
WebLibrary是点网核心Web应用程序(包含控制器,是启动项目)。
业务逻辑是服务层,是Web应用程序和数据访问项目之间的中间层。
数据访问是实际执行查询时存在dbContext和存储库类的位置。
Model项目包含POCO和Enums,而不是智能对象,而是整个应用程序中使用的容器。
Bootstrap项目引用了业务逻辑和数据访问项目,以便它可以注册IOC容器的服务和存储库。
查看github repo以获取示例解决方案。 我仍然有一个问题,具体到我的应用程序是这样的:
即使Web库没有对数据访问项目的引用,我仍然可以从其中一个控制器实例化ApplicationContext。 将这些项目分开的重点是,我无法直接在Web项目中获取数据库上下文。 我不确定这是否与Core中的新解决方案结构相关,或者我是否包含了我不知道的内容。
我认为你正在寻找存储库模式。 它是您的业务和DAL之间的一层。
以下是我如何组织最近的解决方案以避免UI了解我的DAL。