有什么方法可以拦截模式创建。我的意思是这样的。 我有这样的数据库上下文注册:
Services.AddDbContext<MyContext>(options => options
.UseSqlServer()
.MyExtensionMethod())
我的扩展方法扩展了
DbContextOptionsBuilder
,我需要从此方法中拦截 OnModelCreating
方法。
我的目标是当用户调用此扩展方法时,我将通过 ModelBuilder.Entity<>
配置将另一个实体添加到此数据库上下文中。
这个新实体实际上是我的库中的类(这个扩展方法也是这个库的一部分)。所以我想从
MyExtensionMethod
拦截用户模式创建并向其中添加新表。我该怎么做?
我尝试过使用
IModelCustomizer
,但问题是它需要替换当前的实现,我害怕使用它,因为也许用户正在使用一些自定义定制器,并且使用我的扩展方法我将替换它。它将破坏用户的功能。
如果我以某种方式装饰当前的IModelCustomizer
,也许会非常有帮助,但是当我尝试时,我找不到任何方法来做到这一点
是的,您可以通过替换选项中的
IModelCustomizer
来实现此目的。
这是此类扩展方法的示例实现:
public static class MyLibraryOptionsExtensions
{
public static DbContextOptionsBuilder MyExtensionMethod(this DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.ReplaceService<IModelCustomizer, MyLibraryCustomModelCustomizer>();
return optionsBuilder;
}
}
public class MyLibraryCustomModelCustomizer : RelationalModelCustomizer
{
public MyLibraryCustomModelCustomizer(ModelCustomizerDependencies dependencies) : base(dependencies)
{
}
public override void Customize(ModelBuilder modelBuilder, DbContext context)
{
// Add your custom configurations here
ApplyCustomConventions(modelBuilder);
}
private void ApplyCustomConventions(ModelBuilder modelBuilder)
{
// register any entities, which you want
modelBuilder.Entity<MyEntity>();
}
}