0

Ich habe zwei Projekte: Webprojekt, das Verbindungszeichenfolge in seinem appsetting.json und Domain-Projekt enthält, das einige Repositories enthält, die Geschäftslogik implementiert. Jetzt muss ich die Verbindungszeichenfolge vom Web zum Domain Projekt übergeben. Zuerst habe ich Verbindung Zeichenfolge Wert von Config über Methode in this article beschrieben, aber wie kann ich es in Domain übergeben? In der vorherigen Version von ASP konnte ich es über ConfigurationManager tun, aber jetzt ist es unmöglich.Konfigurieren von Entity Framework im Multiprojekt ASP Core 1 Lösung

My DomainDbContext:

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

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

und es verwendet, wie

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

In Controller Provider Aufrufe wie

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() 
     }); 
    } 
} 

Antwort

1

Zuerst habe ich von Config über Methode bekam Verbindungszeichenfolge Wert haben in diesem Artikel beschrieben wird, aber, wie ich es in Domain passieren kann?

Sie sollten nicht müssen. Auch Ihre Domain-Ebene ist fehlerhaft, wenn sie DbContext in Ihrer Domain benötigt. Domain muss Persistenz ignorant sein. Sie erhalten diese Abstraktion normalerweise über Repositories. Ansonsten hängt Ihre Domain von Ihrer Infrastruktur ab.

Zweitens, optimal lösen Sie alle Sachen über Dependency Injection, dann sind alle Konfigurations-Sachen an die Anwendung und nicht ein Anliegen Ihrer Domain.

In früheren Version von ASP ich es über Konfigurationsmanager tun konnte, aber jetzt seine imposible

Das noch DDD verletzt, weil ConfigurationManager ist Infrastruktur (sehr sehr spezifisch für ASP.NET) und nicht gehört in deine Domain.

Idealerweise geben Sie einfach Ihre DbContext an Ihren Provider-Klassenkonstruktor weiter. Wenn dies nicht möglich ist (Ihr Provider hat eine längere Lebensdauer als Ihr DbContext), übergeben Sie eine Factory, die den DbContext auflöst und dann bei Bedarf auflöst.

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

Die Art und Weise Kontexte und EF im allgemeinen in EF7 konfiguriert ist (was ist, was ich nehme, dass Sie verwenden, seit Sie .NET Core erwähnt haben) hat sich von der vorherigen Version geändert ns. Eine Möglichkeit besteht darin, die OnConfiguring-Methode wie bereits beschrieben zu überschreiben. Allerdings ist die häufigste Methode ist Optionen an den Konstruktor DbContext zu liefern, die Sie EF ermöglicht es in Ihrem Web-Projekt zu konfigurieren und die Verbindungszeichenfolge übergeben:

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

Dann in Startup.cs in Ihrem Web-Projekt können Sie konfigurieren, wie folgt Ihr DbContext:

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

Sie müssen die zwicken "Connection: DomainDb", basierend auf appsettings.json. Für die oben arbeiten sollte es so aussehen:

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