假设我有一个方法可以从数据库中加载一些实体,对每个实体进行 API 调用,从第三方获取 token 并保存它们。
API 调用至关重要,因此我们希望每次调用都立即记录到数据库中。
所以我把context.SaveChanges
放在CriticalAPI
里,分别保存每条日志。
问题在于此 SaveChanges
还会保存在 Method()
中修改的 Posts
实体。
我希望 CriticalAPI
只保存日志,而不保存其他对象。一种方法是创建另一个上下文并在该方法中使用,但它违反了依赖注入(inject),因为我应该在我的方法中实例化一个新的上下文。
达到这个要求的正确方法是什么?
public void Method(){
var entities = context.Posts.Where(/* something */).ToList();
foreach (var entity in entities){
var result = CriticalAPI(entity.Id);
entity.Token = result;
}
context.SaveChanges();
}
public int CriticalAPI(int id){
var token = /* do something critical */
context.Logs.Add(new Log(){
entityId = id
});
context.SaveChanges();
return token;
}
最佳答案
您可以使用 abstract factory pattern .只需定义上下文工厂接口(interface)并注入(inject)工厂。然后在任何需要创建新上下文实例的地方使用工厂:
interface IDbContextFactory {
DbContext CreateContext();
}
//...
public void Method() {
using (var context = contextFactory.CreateContext()) {
context.Posts.Where(/* something */)
.ForEach(entity => {
var result = CriticalAPI(entity.Id);
entity.Token = result;
});
context.SaveChanges();
}
}
public int CriticalAPI(int id) {
using (var context = contextFactory.CreateContext()) {
var token = /* do something critical */
context.Logs.Add(new Log(){
entityId = id
});
context.SaveChanges();
return token;
}
}
关于c# - 如何在不违反依赖注入(inject)的情况下为单个数据库使用多个上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58864093/