加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-core – 如何使用StructureMap注册表在单独的项目中配置

发布时间:2020-12-16 03:17:50 所属栏目:asp.Net 来源:网络整理
导读:我正在尝试在Visual Studio中设置一个解决方案,该解决方案将所有EF Core文件放在一个项目(Infrastructure)中,与我的ASP.NET Core Web项目分开.此外,我想防止开发人员意外地使用基础结构项目中的类型,因此我试图避免从Web到基础结构的引用.这可以在ASP.NET 5
我正在尝试在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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读