[英]Entity Framework Dependency Injection
我想知道,依賴注入在EFCore中是如何工作的。
我想更改DbSetFinder
的行為, 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<>
中DbContext
但不會發現成員,這是從繼承DbSet<>
這意味着我必須使用Type.IsAssignableFrom(Type)
方法擴展代碼,以便查找繼承的實例。
我想用我的DbSetFinder
類覆蓋默認的IDbSetFinder
, DbSetFinder
為它提供了功能。 只是我不知道我在哪里可以做到這一點,我什么時候能做到這一點。
有一個ServiceProvider,可能會改變實現,但我不知道該怎么做。
有一個類,其中設置了核心服務依賴項:
public virtual EntityFrameworkServicesBuilder TryAddCoreServices()
{
TryAdd<IDbSetFinder, DbSetFinder>();
TryAdd<IDbSetInitializer, DbSetInitializer>();
TryAdd<IDbSetSource, DbSetSource>();
TryAdd<IDbQuerySource, DbSetSource>();
...
如何在填充默認值之前聯系此服務提供商,以及如何更改其實施。
最簡單(也可能是公開的)方法是覆蓋OnConfiguring
並使用DbContextOptionsBuilder.ReplaceService
方法:
用不同的實現替換服務契約的內部實體框架實現。
例如
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.ReplaceService<IDbSetFinder, CustomDbSetFinder>();
// ...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.