与自定义资源提供程序一起使用DbContext时,使用不同的范围进行注入

时间:2012-11-08 10:14:43

标签: asp.net-mvc entity-framework dependency-injection structuremap resourceproviderfactory

在一个应用程序中,我有以下组件(其中包括):

  • MyDbContext:实体框架数据访问
  • DBResourceProviderFactory:提供自定义ResourceProviderFactory的自定义IResourceProvider(称为DBResourceProvider ...)
  • 其他服务
  • StructureMap

自定义资源提供程序正在使用MyDbContext在数据库中查找资源,注入类似this SO answer中所述。

MyDbContext也用于其他各种服务,由于它是一个Web应用程序,我使用StructureMaps HttpContextScoped方法将MyDbContext的生命周期限制为请求的生命周期(见an other SO question and its answer on this subject):

x.For<MyDbContext>().HttpContextScoped();

但是,似乎IResourceProvider的生命周期不限于单个http请求。因此,DBResourceProvider会一直挂在MyDbContext引用上,该引用将在第一次请求后处理。

如何处理生命周期不匹配 - 在将HttpContext范围的实例返回给所有其他服务时,StructureMap是否为MyDbContext返回了一个临时IDbResourceProvider

我需要两种不同的实现吗?标记界面? 或者,首先使用Entity Framework查找本地化资源(性能等)是不是一个坏主意?

1 个答案:

答案 0 :(得分:1)

如果您的服务具有(或需要)其生命周期长于(其中一个)依赖项的服务,则通常的解决方案是使用工厂来获取这些依赖项。

在您的情况下,解决方案可能很简单。在composition root的MVC应用中定义DBResourceProvider后,只需成功使用DependencyResolver.Current.GetService方法获取MyDbContext

DBResourceProvider服务不是组合根的一部分时(例如因为它包含您需要测试的业务逻辑),您可以将该逻辑提取到其自己的类中,以允许该服务在组合根目录中,或者您可以注入一个(单例)工厂(例如IDbContextFactoryFunc<MyDbContext>),以便您获得要解析的正确实例。