在我们的应用程序中,我们有一个 Dataservice 项目,它通过 EF 与数据库执行所有“握手”。我们经常使用 Scaffold-Dbcontext 来更新数据服务中的模型。我现在尝试引入 Hangfire,但因为这会生成一堆表,所以我对其进行了设置,以便 Hangfire 位于它自己的数据库中。
我有一个 AuditLog 表位于主项目中,需要通过hangfire 进行更新。
因此,在 Hangfire 项目中,我引用了我的数据服务,以便我可以引用 AuditLog 对象以便能够对其进行写入。但现在我需要从 Dataservice 引用 Hangfire 项目来运行其方法,因此现在出现了循环依赖错误:
所以在我的hangfire项目中我有:
public class HangFireService : DbContext, IHangFireService
{
private DbContext _context;
private readonly IBackgroundJobClient _jobClient;
public HangFireService(DbContext context)
{
_context = context;
_jobClient = new BackgroundJobClient();
}
public void JobLogUpdate<T>(T origin, T newValues, string user) where T : class
{
_jobClient.Enqueue(() => LogUpdates(origin,newValues,user));
}
......
private void LogUpdates<T>(T origin, T newValues, string user) where T : class
{
AuditLog audit = new AuditLog() { Id = Guid.NewGuid(), ChangedBy = user, ChangedDate = DateTime.Now };
Type myType = typeof(T);
//first make sure same type
if (origin.GetType() != newValues.GetType())
{
throw new InvalidOperationException("Objects of different Type");
}
audit.Original = JsonSerializer.Serialize(origin);
audit.NewValue = JsonSerializer.Serialize(newValues);
audit.ObjectName = myType.Name;
_context.Add(audit);
_context.SaveChanges();
}
然后在我的数据服务中我有:
var hangfire = new HangFireService(_context);
// where bookingOrig and BookingNew are both booking class
hangfire.JobLogUpdate(bookingOrig, bookingNew, booking.CreatedBy);
如何传入 AuditLog 类,以便在 Hangfire 项目中删除对 DataService 的引用?
如果 AuditLog 类是一个简单的 PoCo,您可以创建另一个项目(类库)并将类 AuditLog 放入其中。您的其他项目可以引用它并共享 AuditLog,而无需循环依赖。
一般来说,您应该使用控制模式反转恕我直言。根据我个人的经验,通过正确使用接口和具体实现,以及用于依赖注入的库,循环依赖是不存在的。
第三种方法是使用工厂在 HangFireService 中创建 AuditLog。如果您有一个引用了其他两个项目的顶级项目,则这是有效的。构造函数:
LogUpdates方法的第一行:
然后像这样实例化你的 HangFireService :