2017-10-27 2 views
2

내 ASP.NET 핵심 웹 프로젝트와 별도로 하나의 프로젝트 (인프라)에 모든 EF 핵심 파일이있는 Visual Studio에서 솔루션을 설정하려고합니다. 또한 개발자가 실수로 인프라 프로젝트의 유형을 사용하지 못하도록하고 싶기 때문에 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 코어, 그러나, 우리는() 메소드 웹 프로젝트의 Startup.ConfigureServices에서 EF 코어를 구성 : 여기에 설명 된대로이 쉽게 ASP.NET 5/EF 6에서 이루어집니다

AddDbContext 로직을 Startup에서 내 인프라 프로젝트로 옮길 방법이 있습니까? 난 이미 인프라 프로젝트에 StructureMap 레지스트리를, 그래서 거기에서 필요한 서비스를 연결할 수있는 방법이 있다면 그 프로젝트이기 때문에, 그것은 DbContext 유형에 액세스 할 수 있습니다 :

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

당신은 볼 수 있습니다 이 분기의 프로젝트의 현재 상태 : https://github.com/ardalis/cleanarchitecture/tree/ardalis/projectref 내 목표는 Web에서 인프라로 프로젝트 참조를 제거하지만 솔루션을 시작할 때 AppDbContext를로드하는 것입니다.

예 :

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이 무엇을 체크하면 생각이 테스트를하지 않았다 (그것이 무엇을 사용 범위와 어떤

답변

0

는 DbContextBuilder을 수동으로 이런 일을 레지스트리에 추가하려고 했나 구성이 dbContextOptions에 추가됨)이를 수동으로 구조 맵에 등록 할 수 있습니다.

관련 문제