Entity Framework: 在其他选项有问题时将依赖项注入实体

Entity Framework: Injecting dependencies into entities when other options are problematic

我正在处理一个存在重大体系结构问题的大型 C# 企业项目。其中一个问题是到处都有对 StructureMap 容器的静态引用(静态服务定位器)。作为解决问题的第一步,我们将容器传递给构造函数并删除静态容器引用。

不幸的是,Entity Framework 创建的实体中存在对静态容器的调用。将所有这些依赖关系推送到这些实体的客户端现在是不可行的,因为这种情况发生的频率和变化的范围。我们的目标是删除静态容器并进行许多管理不允许的更改。

我想在 Entity Framework 创建实体时将容器注入到实体中,有没有办法做到这一点?

提前致谢:)

我记得几年前我在某个地方读到过可以通过构造函数将服务注入到实体中,但我现在找不到了,所以也许我正在阅读有关 IDbDependencyResolver 的其他用途。

作为临时解决方案,我建议使用 IHaveServiceLocator 等界面标记实体并使用 ObjectMaterialized 事件。

public interface IHaveServiceLocator
{
    IServiceLocator ServiceLocator { get; set; }
}

然后您创建 dbContext 的地方应该可以访问服务定位器,以便您可以将其设置为创建的实体。

((IObjectContextAdapter)dbContext).ObjectContext.ObjectMaterialized += (s, e) =>
{
    var entity = e.Entity as IHaveServiceLocator;

    if (entity != null)
    {
        entity.ServiceLocator = structureMapServiceLocator;
    }
}