ssm*_*ith 7 structuremap entity-framework-core asp.net-core
我正在尝试在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
但是,在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>();
}
Run Code Online (Sandbox Code Playgroud)
有没有办法将AddDbContext逻辑移出Startup我的基础设施项目?我已经在Infrastructure项目中有一个StructureMap注册表,所以如果有办法从那里连接所需的服务,它将有权访问DbContext类型,因为它在该项目中:
public class InfrastructureRegistry : Registry
{
public InfrastructureRegistry()
{
For(typeof(IRepository<>)).Add(typeof(EfRepository<>));
}
}
Run Code Online (Sandbox Code Playgroud)
您可以在此分支中查看项目的当前状态:https: //github.com/ardalis/cleanarchitecture/tree/ardalis/projectref
我的目标是将项目引用从Web移除到基础结构,但仍然有解决方案在启动时加载AppDbContext.
您是否尝试手动添加到注册表 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<>));
}
}
Run Code Online (Sandbox Code Playgroud)
没有对此进行测试,但我认为如果您检查 AddDbContext 的作用(它使用的范围以及添加到 dbContextOptions 的配置),您可以将其手动注册到结构图。
| 归档时间: |
|
| 查看次数: |
1023 次 |
| 最近记录: |