在一个应用程序中,我有以下组件(其中包括):
MyDbContext
:实体框架数据访问DBResourceProviderFactory
:提供自定义ResourceProviderFactory
的自定义IResourceProvider
(称为DBResourceProvider
...)自定义资源提供程序正在使用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查找本地化资源(性能等)是不是一个坏主意?
答案 0 :(得分:1)
如果您的服务具有(或需要)其生命周期长于(其中一个)依赖项的服务,则通常的解决方案是使用工厂来获取这些依赖项。
在您的情况下,解决方案可能很简单。在composition root的MVC应用中定义DBResourceProvider
后,只需成功使用DependencyResolver.Current.GetService
方法获取MyDbContext
。
当DBResourceProvider
服务不是组合根的一部分时(例如因为它包含您需要测试的业务逻辑),您可以将该逻辑提取到其自己的类中,以允许该服务在组合根目录中,或者您可以注入一个(单例)工厂(例如IDbContextFactory
或Func<MyDbContext>
),以便您获得要解析的正确实例。