c# - 如何在不违反依赖注入(inject)的情况下为单个数据库使用多个上下文

标签 c# .net .net-core

假设我有一个方法可以从数据库中加载一些实体,对每个实体进行 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/

相关文章:

wpf - 如何将 Microsoft Edge WebView2 Runtime 添加为先决条件

c# - 尝试使用 HttpClient 检索访问 token 时出现错误

amazon-web-services - AWS with .NET - 从 CloudWatch 读取日志 - 没有返回日志数据

c# - 在 Unity 中访问具有不同副本的游戏对象

c# - 如何创建 XML 字符串而不是使用字符串生成器?

c# - 如何保护用 .Net 编写的 API 的安全

c# - 检查 LINQ to XML 中的单独节点

c# - 如何在C#中使用try-finally构造?

c# - ASP.NET MVC5 自定义 AuthorizeAttribute 未被正确调用

.net - 为什么我的 .net 计算的 MD5 哈希值不等于在网站上计算的哈希值?