discuz可以做商城网站吗,北京学生做兼职的网站,房产微信营销方案,赤峰做网站的公司【导读】如果我们存在基础设施服务和其他服务#xff0c;我们会定义属于基础设施服务的上下文以及其他服务的上下文#xff0c; 而且会独立部署#xff0c;此时其他服务需要使用基础服务#xff0c;我们都会暴露基础服务接口给到其他服务调用#xff0c;这也是常规操作若在…【导读】如果我们存在基础设施服务和其他服务我们会定义属于基础设施服务的上下文以及其他服务的上下文 而且会独立部署此时其他服务需要使用基础服务我们都会暴露基础服务接口给到其他服务调用这也是常规操作若在项目较小的情况下且仅内部调用等等为免去重新定义基础设施服务上下文以及模型等等我们大可以将基础设施服务上下文打成nuget包形式或项目引用方式等等然后其他服务上下文继承基础设施上下文如此这般我们就可以操作基础设施模型那么我们应该怎么做呢实现上下文继承我们从头开讲比如我们定义其他服务上下文以及模型等等public class TestDbContext : DbContext
{public TestDbContext(DbContextOptionsTestDbContext options) : base(options){}public DbSetTest Tests { get; set; }
}[Table(tests)]
public class Test
{[Column(id)]public int Id { get; set; }[Column(name)]public string Name { get; set; }
}接下来我们使用控制台程序注入上下文并查询表数据最基本操作无需我多言static void Main(string[] args)
{var services new ServiceCollection();services.AddDbContextTestDbContext(options {options.UseSqlServer(Data Source.;Initial CatalogEFCore;User IDsa;Passwordsa123;);});var serviceProvider services.BuildServiceProvider();var context serviceProvider.GetRequiredServiceTestDbContext();var result JsonConvert.SerializeObject(context.Tests.ToList());
}此时上述服务上下文需要调用基础服务上下文我们该怎么办呢先定义好基础服务上下文public class BaseDbContext : DbContext
{public BaseDbContext(DbContextOptionsBaseDbContext options) : base(options){}public DbSetUser Users { get; set; }
}[Table(users)]
public class User
{[Column(id)]public int Id { get; set; }[Column(name)]public string Name { get; set; }[Column(birthdate)]public DateTime BirthDate { get; set; }[Column(address)]public string Address { get; set; }
}接下来我们将其他服务上下文TestDbContext继承自上述基础服务上下文public class TestDbContext : BaseDbContext
{public TestDbContext(DbContextOptionsTestDbContext options) : base(options){}......
}此时编译会报CS1503错误无法将TestDbContext转换为BaseContext因为构造函数参数不匹配我们知道DbContextOptions是DbContextOptionsT父类所以我们只需在BaseDbContext新增一个构造函数即可public class BaseDbContext : DbContext
{public BaseDbContext(DbContextOptionsBaseDbContext options) : base(options){}public BaseDbContext(DbContextOptions options) : base(options){}......
}这样一来我们则可以操作基础服务上下文中的模型如下var context serviceProvider.GetRequiredServiceTestDbContext();var result JsonConvert.SerializeObject(context.Users.ToList());我们到这里是不是就大功告成了呢当然没有若此时通过基础服务上下文直接操作我们发现会抛出如下异常啥意思呢根据大致意思来看就是说上下文构造函数有问题所以无法激活创建上下文那么根本原因在哪里呢这个问题其实在此前博文有讲解 甩出源码如下private static FuncTContext CreateActivator(DbContextOptions options)
{var constructors typeof(TContext).GetTypeInfo().DeclaredConstructors.Where(c !c.IsStatic c.IsPublic).ToArray();if (constructors.Length 1){var parameters constructors[0].GetParameters();if (parameters.Length 1 (parameters[0].ParameterType typeof(DbContextOptions)|| parameters[0].ParameterType typeof(DbContextOptionsTContext))){returnExpression.LambdaFuncTContext(Expression.New(constructors[0], Expression.Constant(options))).Compile();}}return null;
}首先获取上下文中声明的构造函数过滤掉了静态和公共且上下文必须有且只能有一个显式构造函数且参数只能为DbContextOptionsT我们恍然大悟将新增的构造函数访问修饰符修改为受保护的protected即可public class BaseDbContext : DbContext
{public BaseDbContext(DbContextOptionsBaseDbContext options) : base(options){}protected BaseDbContext(DbContextOptions options) : base(options){}......
}哦没啥可总结的勒这玩意只能根据经验猜或者看源码可得知再会