2016-04-25 64 views
5

我典型的.NET 4.5X Web应用程序结构至少有3层:一个Web项目(一个.NET Web应用程序),一个域/业务逻辑项目(一个类库)和一个数据访问项目(一个类库)。 Web项目引用业务层,业务层引用数据访问层。用数据访问层安排3层的dotnet核心应用程序

我喜欢这种方法,因为我的web项目没有对数据访问项目的引用(它必须先通过域/业务逻辑层)。我的Web项目不应该有任何访问上下文或存储库类。

在3层.net 4.5.X应用程序中,我在web.config中声明了连接字符串,并将DbContext的名称作为连接字符串的名称属性。

在新DOTNET核心的模式,我看到每一个例子已在Startup.cs配置像这样的DbContext:

public void ConfigureServices(IServiceCollection services) 
{ 
    // Add framework services. 
    services.AddMvc(); 
    services.AddEntityFramework() 
     .AddSqlServer() 
     .AddDbContext<MyApplicationContext>("myconnectionstring or reference to it"); 
} 

通过给启动一个具体的类使用的的DbContext,我必须引用数据访问项目,其中定义了dbcontext。我宁愿只参考中间层,并避免引用DAL。

我的问题是:我应该如何安排我的解决方案结构,以便避免将我的Web项目的引用添加到我的数据访问项目中?

我可以使用appsettings.json属性吗?

我可以以其他方式添加我的实体配置吗?

有没有什么专业我缺少关于网络核心?

预先感谢您。

+1

此答案可能会有用,它会删除网络层中的EF引用http://stackoverflow.com/a/38360204/1544886 –

回答

3

我发现使用EF6和DOTNET核心,我有相当舒适的解决方案。

它不使用EF7的services.AddSqlServer()调用,而是使用EF6配置并将DbContext注册到启动时调用的Bootstrap类中。

public static class BootstrapConfig 
{ 
    public static void RegisterApplicationServices(this IServiceCollection services, IConfigurationRoot configuration) 
    { 
     // DbContext 
     services.AddScoped<DbContext>(x => new ApplicationContext(configuration["Data:ApplicationContext:ConnectionString"])); 
    } 
} 

这是从Startup.cs在WebLibrary项目称为

public void ConfigureServices(IServiceCollection services) 
{ 
    // Add framework services. 
    services.AddMvc(); 

    services.RegisterApplicationServices(Configuration); 
} 

enter image description here

WebLibrary是点网核心的Web应用程序(包含控制器,是启动项目)。

业务逻辑是服务层,是Web应用程序和数据访问项目之间的中间层。

数据访问是实际执行查询时存在dbContext和存储库类的地方。

Model项目包含POCO和枚举,不是智能对象,而是跨应用程序使用的容器。

引导项目引用了业务逻辑和数据访问项目,以便它可以注册IOC容器的服务和存储库。

查看示例解决方案的github repo一个问题我还是有,具体到我的应用程序是这样的:

即使Web库没有数据访问项目的引用,我仍然可以从控制器的一个实例化一个ApplicationContext。将这些项目分离出来的整个目的是让我们无法直接在Web项目中获取数据库上下文。我不确定这是否与Core中的新解决方案结构有关,或者如果我包含某些我不知道的内容。

+3

在你的尝试中做得很好,有时我想知道是否值得所有的努力只是防止上下文渗透到它不应该的层中,一个有信誉的开发团队可能会得到而不会滥用这个事实,即有权访问上下文 –

2

我认为你正在寻找Repository模式。它是您的业务与DAL之间的一个层。

下面是我组织最近的解决方案,以避免UI知道我的DAL。

enter image description here

+0

感谢您的回复。我非常了解存储库模式。在上面描述的数据访问项目中,我创建了我的存储库类,这些类由中间(业务逻辑)层的服务类使用。服务类然后被我的web成员(通常是mvc/api控制器)使用。我主要关心的是避免从客户端/ web项目到数据层的项目引用。 – rictionaryFever

+0

所以,你可以为你的仓库创建另一个项目,并让该项目引用你的数据层。 并让您的Web项目引用您的新存储库项目? –

+0

感谢您的跟进。我可以看到你所建议的项目结构的实用程序,我用.NET 4应用程序实现这个结构没有问题,但是我的主要问题是理解如何用.NET Core(.NET 5)实现分层。这可能是我完全忽略了这一点。无论结果如何,我都会用我的解决方案更新这个问题。在.NET Core中,您可以在Startup.cs中将您的dbcontext作为服务添加。我想保留这个dbcontext的Web应用程序项目。 – rictionaryFever