Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 使用泛型dbContext(多个dbContext)获取泛型存储库_Entity Framework_Repository_Asp.net Core 2.0_Repository Pattern - Fatal编程技术网

Entity framework 使用泛型dbContext(多个dbContext)获取泛型存储库

Entity framework 使用泛型dbContext(多个dbContext)获取泛型存储库,entity-framework,repository,asp.net-core-2.0,repository-pattern,Entity Framework,Repository,Asp.net Core 2.0,Repository Pattern,在我的asp.net core 2 api项目中,我在使用entity framework构建通用存储库时迷路了,该框架具有多个上下文 我需要的是将我的存储库注入控制器,而不知道它正在使用哪个上下文 DbContext 存储库 公共类eRepository:IRepository,其中tenty:class,ienty { 私有只读IDbContext _context; 私有只读数据库集_DbSet; 公共eForepository(IDbContext) { _上下文=上下文; _dbSet

在我的asp.net core 2 api项目中,我在使用entity framework构建通用存储库时迷路了,该框架具有多个上下文

我需要的是将我的存储库注入控制器,而不知道它正在使用哪个上下文

DbContext 存储库
公共类eRepository:IRepository,其中tenty:class,ienty
{
私有只读IDbContext _context;
私有只读数据库集_DbSet;
公共eForepository(IDbContext)
{
_上下文=上下文;
_dbSet=_context.Set();
}
/*其他东西*/
}     
启动
public void配置服务(IServiceCollection服务)
{
services.AddDbContext(选项=>
{
options.UseSqlServer(Configuration.GetConnectionString(“DefaultConnection”))
.使用记录器工厂(_记录器);
});
services.AddDbContext(选项=>
{
options.UseSqlServer(Configuration.GetConnectionString(“DefaultConnection”);
});
addScope(typeof(IRepository)、typeof(eRepository));
services.addScope();
services.addScope();
services.AddUnitOfWork();
}
控制器
公共类UserController:Controller
{
专用只读IRepository存储库;
私有只读IAAuthorService(U authorService);
专用只读ILogger\u记录器;
公共用户控制器(IRepository存储库、IAuthorService authorService、ILogger记录器)
{
_存储库=存储库;
_authorService=authorService;
_记录器=记录器;
}
}

当我在控制器构造函数中注入
IRepository
时,.net core DI如何解析
User
BlogContext
的实体,因此
IDbContext
应该是
BlogContext
在我的
eRepository
实现中的

 public class EfRepository<TDbContext, TEntity> : IRepository<TEntity>
    where TDbContext : DbContext
    where TEntity : class, IEntity
{
    public EfRepository(IDbContextProvider<TDbContext> dbContextProvider)
    {
    }
}
//EntityTypeInfo is a class has EntityType & DeclaringType props
private IList<EntityTypeInfo> GetEntityTypeInfos()
{
    var result = new List<EntityTypeInfo>();
    var dbContextTypes = this.GetType().Assembly.GetTypes().Where(t => (typeof(DbContext).IsAssignableFrom(t)));
    foreach (var dbContextType in dbContextTypes)
    {
        result.AddRange(
            from property in dbContextType.GetProperties(BindingFlags.Public | BindingFlags.Instance)
            where
                Common.IsAssignableToGenericType(property.PropertyType, typeof(DbSet<>)) &&
                Common.IsAssignableToGenericType(property.PropertyType.GenericTypeArguments[0], typeof(IEntity))
            select new EntityTypeInfo(
                property.PropertyType.GenericTypeArguments[0],
                property.DeclaringType
                );
    }
    return result;
}
公共类eRepository:IRepository
其中TDbContext:DbContext
其中tenty:类,tenty
{
公共eForepository(IDbContextProvider dbContextProvider)
{
}
}
并获得如下DbContext实体信息:

 public class EfRepository<TDbContext, TEntity> : IRepository<TEntity>
    where TDbContext : DbContext
    where TEntity : class, IEntity
{
    public EfRepository(IDbContextProvider<TDbContext> dbContextProvider)
    {
    }
}
//EntityTypeInfo is a class has EntityType & DeclaringType props
private IList<EntityTypeInfo> GetEntityTypeInfos()
{
    var result = new List<EntityTypeInfo>();
    var dbContextTypes = this.GetType().Assembly.GetTypes().Where(t => (typeof(DbContext).IsAssignableFrom(t)));
    foreach (var dbContextType in dbContextTypes)
    {
        result.AddRange(
            from property in dbContextType.GetProperties(BindingFlags.Public | BindingFlags.Instance)
            where
                Common.IsAssignableToGenericType(property.PropertyType, typeof(DbSet<>)) &&
                Common.IsAssignableToGenericType(property.PropertyType.GenericTypeArguments[0], typeof(IEntity))
            select new EntityTypeInfo(
                property.PropertyType.GenericTypeArguments[0],
                property.DeclaringType
                );
    }
    return result;
}
//EntityTypeInfo是一个具有EntityType和DeclaringType属性的类
私有IList GetEntityTypeInfos()
{
var result=新列表();
var dbContextTypes=this.GetType().Assembly.GetTypes().Where(t=>(typeof(DbContext).IsAssignableFrom(t));
foreach(dbContextTypes中的变量dbContextType)
{
result.AddRange(
来自dbContextType.GetProperties(BindingFlags.Public | BindingFlags.Instance)中的属性
哪里
Common.IsAssignableToGenericType(property.PropertyType,typeof(DbSet))&&
Common.IsAssignableToGenericType(property.PropertyType.GenericTypeArguments[0],typeof(ienty))
选择新EntityTypeInfo(
property.PropertyType.GenericTypeArguments[0],
property.DeclaringType
);
}
返回结果;
}
因此,我可以使用EntityTypeInfo列表添加相关服务:

var entityTypeInfos = GetEntityTypeInfos();
foreach (var entityTypeInfo in entityTypeInfos)
{
    //
    //Add IDbContextProvider and DbContext services Here
    //

    //Add IRepository services like this
    var repositoryInterface =typeof(IRepository<>);
    var repositoryImplementation =typeof(EfRepository<,>);

    var genericRepositoryType = repositoryInterface.MakeGenericType(entityTypeInfo.EntityType);
    if (!Common.IocHasRegister(genericRepositoryType))
    {
        var implRepositoryType = repositoryImplementation.MakeGenericType(entityTypeInfo.DeclaringType, entityTypeInfo.EntityType);

        services.AddScoped(genericRepositoryType, implRepositoryType);
    }
}
var entityTypeInfos=GetEntityTypeInfos();
foreach(entityTypeInfo中的变量entityTypeInfo)
{
//
//在此处添加IDbContextProvider和DbContext服务
//
//添加像这样的IRepository服务
var repositoryInterface=typeof(IRepository);
var repositoryImplementation=typeof(EfRepository);
var genericRepositoryType=repositoryInterface.MakeGenericType(entityTypeInfo.EntityType);
if(!Common.IocHasRegister(genericRepositoryType))
{
var implRepositoryType=repositoryImplementation.MakeGenericType(entityTypeInfo.DeclaringType,entityTypeInfo.EntityType);
AddScoped(genericRepositoryType、implRepositoryType);
}
}

我用DbContext泛型参数定义了eRepository,如下所示:

 public class EfRepository<TDbContext, TEntity> : IRepository<TEntity>
    where TDbContext : DbContext
    where TEntity : class, IEntity
{
    public EfRepository(IDbContextProvider<TDbContext> dbContextProvider)
    {
    }
}
//EntityTypeInfo is a class has EntityType & DeclaringType props
private IList<EntityTypeInfo> GetEntityTypeInfos()
{
    var result = new List<EntityTypeInfo>();
    var dbContextTypes = this.GetType().Assembly.GetTypes().Where(t => (typeof(DbContext).IsAssignableFrom(t)));
    foreach (var dbContextType in dbContextTypes)
    {
        result.AddRange(
            from property in dbContextType.GetProperties(BindingFlags.Public | BindingFlags.Instance)
            where
                Common.IsAssignableToGenericType(property.PropertyType, typeof(DbSet<>)) &&
                Common.IsAssignableToGenericType(property.PropertyType.GenericTypeArguments[0], typeof(IEntity))
            select new EntityTypeInfo(
                property.PropertyType.GenericTypeArguments[0],
                property.DeclaringType
                );
    }
    return result;
}
公共类eRepository:IRepository
其中TDbContext:DbContext
其中tenty:类,tenty
{
公共eForepository(IDbContextProvider dbContextProvider)
{
}
}
并获得如下DbContext实体信息:

 public class EfRepository<TDbContext, TEntity> : IRepository<TEntity>
    where TDbContext : DbContext
    where TEntity : class, IEntity
{
    public EfRepository(IDbContextProvider<TDbContext> dbContextProvider)
    {
    }
}
//EntityTypeInfo is a class has EntityType & DeclaringType props
private IList<EntityTypeInfo> GetEntityTypeInfos()
{
    var result = new List<EntityTypeInfo>();
    var dbContextTypes = this.GetType().Assembly.GetTypes().Where(t => (typeof(DbContext).IsAssignableFrom(t)));
    foreach (var dbContextType in dbContextTypes)
    {
        result.AddRange(
            from property in dbContextType.GetProperties(BindingFlags.Public | BindingFlags.Instance)
            where
                Common.IsAssignableToGenericType(property.PropertyType, typeof(DbSet<>)) &&
                Common.IsAssignableToGenericType(property.PropertyType.GenericTypeArguments[0], typeof(IEntity))
            select new EntityTypeInfo(
                property.PropertyType.GenericTypeArguments[0],
                property.DeclaringType
                );
    }
    return result;
}
//EntityTypeInfo是一个具有EntityType和DeclaringType属性的类
私有IList GetEntityTypeInfos()
{
var result=新列表();
var dbContextTypes=this.GetType().Assembly.GetTypes().Where(t=>(typeof(DbContext).IsAssignableFrom(t));
foreach(dbContextTypes中的变量dbContextType)
{
result.AddRange(
来自dbContextType.GetProperties(BindingFlags.Public | BindingFlags.Instance)中的属性
哪里
Common.IsAssignableToGenericType(property.PropertyType,typeof(DbSet))&&
Common.IsAssignableToGenericType(property.PropertyType.GenericTypeArguments[0],typeof(ienty))
选择新EntityTypeInfo(
property.PropertyType.GenericTypeArguments[0],
property.DeclaringType
);
}
返回结果;
}
因此,我可以使用EntityTypeInfo列表添加相关服务:

var entityTypeInfos = GetEntityTypeInfos();
foreach (var entityTypeInfo in entityTypeInfos)
{
    //
    //Add IDbContextProvider and DbContext services Here
    //

    //Add IRepository services like this
    var repositoryInterface =typeof(IRepository<>);
    var repositoryImplementation =typeof(EfRepository<,>);

    var genericRepositoryType = repositoryInterface.MakeGenericType(entityTypeInfo.EntityType);
    if (!Common.IocHasRegister(genericRepositoryType))
    {
        var implRepositoryType = repositoryImplementation.MakeGenericType(entityTypeInfo.DeclaringType, entityTypeInfo.EntityType);

        services.AddScoped(genericRepositoryType, implRepositoryType);
    }
}
var entityTypeInfos=GetEntityTypeInfos();
foreach(entityTypeInfo中的变量entityTypeInfo)
{
//
//在此处添加IDbContextProvider和DbContext服务
//
//添加像这样的IRepository服务
var repositoryInterface=typeof(IRepository);
var repositoryImplementation=typeof(EfRepository);
var genericRepositoryType=repositoryInterface.MakeGenericType(entityTypeInfo.EntityType);
if(!Common.IocHasRegister(genericRepositoryType))
{
var implRepositoryType=repositoryImplementation.MakeGenericType(entityTypeInfo.DeclaringType,entityTypeInfo.EntityType);
AddScoped(genericRepositoryType、implRepositoryType);
}
}

我似乎听到了Walter Sobchak的“你正在进入一个痛苦的世界”个人观点:除了更多的工作之外,存储库模式不会给你带来太多。我似乎听到了Walter Sobchak的“你正在进入一个痛苦的世界”