微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

asp.net-core – 如何使用StructureMap注册表在单独的项目中配置EF 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>();
    }

有没有办法将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 举报,一经查实,本站将立刻删除。

相关推荐