将多个注册表自动转换为单个服务。简单喷油器 - > 自动法克翻译



我开发了一个基于 Tripod 和其他灵感的 CQRS 风格的数据库访问框架,但针对 .NET 标准并简化以便于使用。我想将 IoC 拆分为单独的集成包,以便使用者可以轻松地在内部获得我当前正在执行的类型注册,而不会被锁定到特定的 IoC 容器中。我的问题是我只真正与SimpleInjector密切合作,因此不熟悉其他系统及其如何处理特定场景的细微差别。我迫切需要支持 Autofac,所以我想我会在这里尝试看看是否有人可以翻译。

我有以下简单注入器组合根静态类:

public static void RegisterDatabase(this Container container, DbContextOptions<EntityDbContext> dbContextOptions, params Assembly[] assemblies)
{
var scopedLifeStyle = container.Options.DefaultScopedLifestyle;
//container.Register<ICreateDbModel, DefaultDbModelCreator>(scopedLifeStyle); // lifestyle c
container.RegisterInitializer<EntityDbContext>( //(container.InjectProperties);
handlerToInitialise => handlerToInitialise.ModelCreator = new DefaultDbModelCreator()
);
// Setup DbContext
var ctxReg = scopedLifeStyle.CreateRegistration(
() => new EntityDbContext(dbContextOptions),
container);
container.AddRegistration<IUnitOfWork>(ctxReg);
container.AddRegistration<IReadEntities>(ctxReg);
container.AddRegistration<IWriteEntities>(ctxReg);
}

在 ASP.NET 核心解决方案中,我从 Startup.Configure(...( 调用上述内容:

var optionsBuilder = new DbContextOptionsBuilder<EntityDbContext>()
//.UseInMemoryDatabase("Snoogans");
.UseSqlServer(_config.GetConnectionString("DefaultConnection"));
container.RegisterDatabase(optionsBuilder.Options);

这允许我在需要时切换到内存数据库进行单元测试。EntityDbContext 包含用于调用上下文的所有工作单元方法,而无需为每个表指定显式 DbSet。IUnitOfWork、IReadEntities 和 IWriteEntities 接口都定义了 EntityDbContext 上的方法。

所以我不确定我将如何制作一个 Autofac 模块,该模块允许对 dbcontext 进行范围注册,并在 DbContextOptions 中传递,然后多次注册此注册的接口。

有谁知道如何做到这一点?

我制定了这个过程,现在有一个AutoFac模块。我能够按类的实例注册模块,并在实例化时传入选项。由于 EntityDbContext 实现了我在简单注入器方案中分别注册的三个接口,因此 AutoFac 可以方便地推断它们并向 AsImplementInterfaces(( 注册

public class EntityFrameworkModule : Module
{
private readonly DbContextOptions<EntityDbContext> _dbContextOptions;
public EntityFrameworkModule(DbContextOptions<EntityDbContext> dbContextOptions)
{
_dbContextOptions = dbContextOptions;
}
protected override void Load(ContainerBuilder builder)
{
// If the calling code hasn't already registered a custom 
// ICreateDbModel then register the internal DefaultDbModelCreator
builder.RegisterType<DefaultDbModelCreator>()
.IfNotRegistered(typeof(ICreateDbModel))
.As<ICreateDbModel>();
// Expecting IUnitOfWork, IReadEntities and IWriteEntities to be registered with this call
builder.Register(c => new EntityDbContext(_dbContextOptions)
{
ModelCreator = c.Resolve<ICreateDbModel>()
})
.AsImplementedInterfaces()
.InstancePerLifetimeScope();
}
}

最新更新