2017-10-27 13 views
2

私はASP.NET Core Webプロジェクトとは別に、1つのプロジェクト(Infrastructure)にすべてのEFコアファイルを含むVisual Studioでソリューションを設定しようとしています。さらに、開発者がInfrastructureプロジェクトのタイプを誤って使用しないようにするため、WebからInfrastructureへの参照を避けようとしています。StructureMapレジストリを使用して個別のプロジェクトでEFコアを設定する方法

public IServiceProvider ConfigureServices(IServiceCollection services) 
    { 
     string dbName = Guid.NewGuid().ToString(); 
     services.AddDbContext<AppDbContext>(options => 
      options.UseInMemoryDatabase(dbName)); 

     services.AddMvc() 
      .AddControllersAsServices(); 

     // use StructureMap 
     var container = new Container(); 
     container.Configure(config => 
     { 
      config.Scan(_ => 
      { 
       _.AssembliesAndExecutablesFromApplicationBaseDirectory(); 
       _.WithDefaultConventions(); 
       _.LookForRegistries(); 
      }); 

      config.Populate(services); 
     }); 

     return container.GetInstance<IServiceProvider>(); 
    } 
https://ardalis.com/avoid-referencing-infrastructure-in-visual-studio-solutions

は、ASP.NETコアでは、しかし、我々は()メソッドWebプロジェクトのStartup.ConfigureServicesにEFコアを設定します。ここで説明するように、これは簡単にASP.NET 5/EF 6で行われます

AddDbContextロジックをStartupから私のInfrastructureプロジェクトに移動する方法はありますか?私はすでにインフラプロジェクトでのStructureMapレジストリを持っているので、そこから必要なサービスを配線する方法があるならば、それはそのプロジェクトでありますので、DbContextの種類にアクセスする必要があります。

public class InfrastructureRegistry : Registry 
{ 
    public InfrastructureRegistry() 
    { 
     For(typeof(IRepository<>)).Add(typeof(EfRepository<>)); 
    } 
} 

あなたが見ることができます https://github.com/ardalis/cleanarchitecture/tree/ardalis/projectref

私の目標は、WebからInfrastructureへのプロジェクト参照を削除することですが、起動時にソリューションにAppDbContextをロードすることができます。

答えて

0

手動でレジストリDbContextBuilderにこのような何かを追加しようとしました:

例を:

public class InfrastructureRegistry : Registry 
    { 
     public InfrastructureRegistry() 
     { 
      string dbName = Guid.NewGuid().ToString(); 
      var option = new DbContextOptionsBuilder(); 
      var dbContextOptions = option.UseInMemoryDatabase(dbName).Options; 
      For<AppDbContext>().Use(t => new AppDbContext(dbContextOptions, t.GetInstance<IDomainEventDispatcher>())); 
      For(typeof(IRepository<>)).Add(typeof(EfRepository<>)); 
     } 
    } 

はこれをテストしていないが、あなたは何AddDbContextは(何のスコープそれは使いず、何をチェックすると、私は思います設定はdbContextOptionsに追加されます)、手動でそれをstructmapに登録することができます。

関連する問題