我想知道,依赖注入在EFCore中是如何工作的。
我想更改DbSetFinder
的行为以不仅找到DbSet<>
或DbQuery<>
成员,还要找到从其继承的成员。
当前代码如下:
private static DbSetProperty[] FindSets(Type contextType)
{
var factory = new ClrPropertySetterFactory();
return contextType.GetRuntimeProperties()
.Where(
p => !p.IsStatic()
&& !p.GetIndexParameters().Any()
&& p.DeclaringType != typeof(DbContext)
&& p.PropertyType.GetTypeInfo().IsGenericType
&& (p.PropertyType.GetGenericTypeDefinition() == typeof(DbSet<>)
|| p.PropertyType.GetGenericTypeDefinition() == typeof(DbQuery<>)))
.OrderBy(p => p.Name)
.Select(
p => new DbSetProperty(
p.Name,
p.PropertyType.GetTypeInfo().GenericTypeArguments.Single(),
p.SetMethod == null ? null : factory.Create(p),
p.PropertyType.GetGenericTypeDefinition() == typeof(DbQuery<>)))
.ToArray();
}
在DbSet<>
的{{1}}中找到了此代码,但没有找到从DbContext
继承来的成员。
这意味着我必须使用DbSet<>
方法扩展代码,以查找继承的实例。
我想用我的Type.IsAssignableFrom(Type)
类在默认的IDbSetFinder
中覆盖,EFCore为它提供了功能。只是我不知道该在哪里做,什么时候可以做。
有一个ServiceProvider,可以更改实现,但是我不知道该怎么做。
有些类设置了核心服务依赖项:
DbSetFinder
如何在此服务提供商填入默认值之前联系我,以及如何更改其实现。
答案 0 :(得分:4)
最简单(并且可能打算公开)的方法是覆盖OnConfiguring
并使用DbContextOptionsBuilder.ReplaceService方法:
将服务合同的内部Entity Framework实现替换为其他实现。
例如
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.ReplaceService<IDbSetFinder, CustomDbSetFinder>();
// ...
}