我正在尝试在Visual Studio中设置一个解决方案,该解决方案将所有EF Core文件放在一个项目(Infrastructure)中,与我的ASP.NET Core Web项目分开.此外,我想防止开发人员意外地使用基础结构项目中的类型,因此我试图避免从Web到基础结构的引用.这可以在ASP.NET 5 / EF 6中轻松完成,如下所述:
https://ardalis.com/avoid-referencing-infrastructure-in-visual-studio-solutions
https://ardalis.com/avoid-referencing-infrastructure-in-visual-studio-solutions
但是,在ASP.NET Core中,我们在Web项目的Startup.ConfigureServices()方法中配置EF Core:
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>(); }
有没有办法将AddDbContext逻辑从Startup移到我的Infrastructure项目中?我已经在Infrastructure项目中有一个StructureMap注册表,所以如果有办法从那里连接所需的服务,它将有权访问DbContext类型,因为它在该项目中:
public class InfrastructureRegistry : Registry { public InfrastructureRegistry() { For(typeof(IRepository<>)).Add(typeof(EfRepository<>)); } }
您可以在此分支中查看项目的当前状态:
https://github.com/ardalis/cleanarchitecture/tree/ardalis/projectref
我的目标是将项目引用从Web移除到基础结构,但仍然有解决方案在启动时加载AppDbContext.
解决方法
您是否尝试手动添加到Registry 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的配置),你可以手动注册到structuremap.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。