在多项目ASP Core 1解决方案中配置实体框架

时间:2016-04-22 10:50:24

标签: entity-framework configuration asp.net-core entity-framework-core

我有两个项目:在其appsetting.json中包含连接字符串的Web项目和包含一些实现业务逻辑的存储库的Domain项目。现在我需要将连接字符串从Web传递到Domain项目。首先,我通过this article中描述的方法从配置获得连接字符串值,但我如何将其传递到域?在以前版本的ASP中,我可以通过ConfigurationManager来实现,但现在它是不可能的。

我的DomainDbContext:

public class DomainDbContext : DbContext {
    public DbSet<SomeEntity> SomeEntities{ get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder builder) {
        builder.UseNpgsql(@"HardcodedConnectionString");
    }
}

并且像

一样使用
public List<SomeEntityDto> GetAll() {
    using(var context = new DomainDbContext()) {
        return AutoMapperHelper.Mapper.Map<List<SomeEntityDto>>(context.SomeEntities.ToList());
    }
}

在控制器提供程序调用中,如

public class SomeController : Controller {
    private readonly AppSettings _settings;
    private readonly ISomeProvider _someProvider;
    public OrderController( IOptions<AppSettings> settings,
                            ISomeProvider someProvider) {
        _settings = settings.Value;
        _someProvider = someProvider;
    }
    public ActionResult Index() {
        return View("Index", new SomeModel {
            someEntities = _someProvider.GetAll()
        });
    }
}

2 个答案:

答案 0 :(得分:1)

在EF7中配置上下文和EF的方式(这是我假设您使用的,因为您已经提到过.NET Core)已经从以前的版本发生了变化。一种方法是覆盖OnConfiguring方法,就像您已经完成的那样。但是,最常见的方法是为DbContext构造函数提供选项,这将允许您在Web项目中配置EF并传递连接字符串:

public class DomainDbContext : DbContext
{
    public DomainDbContext(DbContextOptions options) : base(options)
    { }
}

然后在Web项目的Startup.cs中,您可以按如下方式配置DbContext:

public void ConfigureServices(IServiceCollection services)
{
    services.AddEntityFramework()
            .AddSqlServer()
            .AddDbContext<DomainDbContext>(o => o.UseSqlServer(Configuration["ConnectionStrings:DomainDb"]));
}

您需要调整&#34; ConnectionStrings:DomainDb&#34;基于appsettings.json。为了使上述工作,它应该类似于:

{
  "ConnectionStrings": {
    "DomainDb": "Data Source=.\\SQLSERVER;Initial Catalog=DomainDb;Integrated Security=SSPI;"
  }
}

答案 1 :(得分:1)

  

首先,我通过本文中描述的方法从配置获得连接字符串值,但我如何将其传递到域?

你不应该这样做。如果您的域名需要DbContext,那么您的域图层也存在缺陷。域必须是持久性无知的。您通常会通过存储库获得此抽象。否则,您的域名将取决于您的基础架构。

其次,通过依赖注入最佳地解决所有问题,然后所有配置内容都取决于应用程序,而不是您域的关注。

  

在以前版本的ASP中,我可以通过ConfigurationManager来实现,但现在它是不可能的

仍然违反了DDD,因为ConfigurationManager是基础结构(非常特定于ASP.NET),并且不属于您的域。

理想情况下,您只需将DbContext传递给提供者类构造函数即可。如果您不能(您的提供商的生命周期比您的DbContext更长),请传递解析DbContext的工厂,然后根据需要解决它。

using(var dbContext = this.dbContextFactory.Create()) 
{
}