Gyö*_*yás 3 c# entity-framework entity-framework-core
我想知道,依赖注入在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();
}
Run Code Online (Sandbox Code Playgroud)
在DbSet<>中找到了该代码,DbContext但未从中继承成员DbSet<>。这意味着我必须使用Type.IsAssignableFrom(Type)方法扩展代码,以查找继承的实例。
我想IDbSetFinder用我的DbSetFinder类覆盖默认值,EFCore为它提供了功能。只是我不知道该在哪里,什么时候该做。
有一个ServiceProvider,并且可以更改实现,但是我不知道该怎么做。
有一个类设置了核心服务依赖项:
public virtual EntityFrameworkServicesBuilder TryAddCoreServices()
{
TryAdd<IDbSetFinder, DbSetFinder>();
TryAdd<IDbSetInitializer, DbSetInitializer>();
TryAdd<IDbSetSource, DbSetSource>();
TryAdd<IDbQuerySource, DbSetSource>();
...
Run Code Online (Sandbox Code Playgroud)
在填充默认值之前,如何联系该服务提供商,以及如何更改其实现。
最简单的(并且可能是预期的公开)方法是重写OnConfiguring和使用DbContextOptionsBuilder.ReplaceService方法:
用其他实现替换服务合同的内部Entity Framework实现。
例如
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.ReplaceService<IDbSetFinder, CustomDbSetFinder>();
// ...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
161 次 |
| 最近记录: |