C# 实体框架:在其他选项有问题时将依赖项注入实体

C# 实体框架:在其他选项有问题时将依赖项注入实体,c#,entity-framework,dependency-injection,structuremap,service-locator,C#,Entity Framework,Dependency Injection,Structuremap,Service Locator,我正在从事一个大型C#enterprise项目,该项目存在重大的体系结构问题。其中一个问题是到处都有对StructureMap容器的静态引用(静态服务定位器)。作为解决问题的第一步,我们将容器传递给构造函数并删除静态容器引用 不幸的是,实体框架创建的实体中存在对静态容器的调用。现在将所有这些依赖关系推送到这些实体的客户机上是不可行的,因为这种情况发生的频率和更改的范围。我们的目标是删除静态容器,并进行管理层不允许的许多更改 当实体由实体框架创建时,我想将容器注入实体,有什么方法可以做到这一点吗

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

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

当实体由实体框架创建时,我想将容器注入实体,有什么方法可以做到这一点吗


提前感谢:)

我记得几年前我在某个地方读到,服务可以通过构造函数注入实体,但我现在找不到它,所以我可能在读关于哪个服务有另一个用途的书

作为一个临时解决方案,我建议使用接口标记实体,如
IHaveServiceLocator
,并使用事件

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

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

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

将依赖项从实体中移出并从服务定位器切换到依赖项注入是计划的一部分,但一步一个脚印……谢谢,效果很好。能够实现一个接口并注入容器是很好的;然而,也有人会大喊“servicelocator,啊!反模式!”。你会对他们说什么?@jenson button事件我绝对同意服务定位器是反模式的,个人几乎从不使用它。但有时它完成了这项工作,避免了像这个问题一样重写整个代码库。
((IObjectContextAdapter)dbContext).ObjectContext.ObjectMaterialized += (s, e) =>
{
    var entity = e.Entity as IHaveServiceLocator;

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