0

私は2つのプロジェクトを持っています:接続文字列がappsetting.jsonであるWebプロジェクトと、ビジネスロジックを実装するいくつかのリポジトリを含むDomainプロジェクトです。今、WebからDomainプロジェクトに接続文字列を渡す必要があります。まず、this articleで説明されている方法で設定から接続文字列値を取得しましたが、ドメインに渡す方法は?以前のバージョンのASPでは、これはConfigurationManagerを介して行うことができましたが、現在は不可能です。マルチプロジェクトASPコア1ソリューションでエンティティフレームワークを設定する

マイDomainDbContext:

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

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

それは

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

答えて

1

まず私は、この記事で説明した方法を経由して設定から接続文字列値を持っている、しかし、私は、ドメインにそれを渡すことができますか?

する必要はありません。また、ドメインにDbContextが必要な場合は、ドメイン層に欠陥があります。ドメインは永続性を知らないといけません。通常、リポジトリを介してこの抽象化を取得します。それ以外の場合、ドメインはインフラストラクチャによって異なります。

第2に、最適にはすべてのものを依存関係注入によって解決します。すべての設定はアプリケーションに依存し、ドメインの関心事ではありません。 ConfigurationManagerは、インフラストラクチャ(ASP.NETに非常に非常に具体的な)で、所属していないので、私は、のConfigurationManager経由でそれを行うが、今はまだDDDに違反してIMPOSIBLE

可能性がASPの以前のバージョンで

あなたのドメインに

DbContextをプロバイダクラスのコンストラクタに渡すのが理想的です。できない場合(プロバイダーがDbContextよりも寿命が長い場合)、DbContextを解決するファクトリを渡し、必要に応じて解決します。

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

ようなコントローラ・プロバイダ・コールで

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

ようなコンテキストおよびEFは、一般にEF7に構成されている方法を使用する(これ.NET Coreについて言及して以来、あなたが使用していると仮定しているものです)が以前のバージョンから変更されましたns。 1つの方法は、すでに行ったようにOnConfiguringメソッドをオーバーライドすることです。

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

その後Startup.csでWebプロジェクトの中にあなたが設定できます。しかし、最も一般的なアプローチは、あなたのWebプロジェクトにEFを設定し、接続文字列を渡すことができるようになる、DbContextのコンストラクタにオプションを提供することですあなたのDbContextとしては、次のとおりです。

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

をあなたが "のconnectionStrings:DomainDbを" 微調整する必要がありますappsettings.jsonに基づきます。それは次のようになります仕事をする上での場合:

{ 
    "ConnectionStrings": { 
    "DomainDb": "Data Source=.\\SQLSERVER;Initial Catalog=DomainDb;Integrated Security=SSPI;" 
    } 
} 
関連する問題